![](/img/trans.png)
[英]Pandas Filtering one dataframe if a value is between two values from another data frame
[英]Pandas filtering rows in one dataframe based on values in another data frame
pandas 的新手,並試圖根據另一個 dataframe 中的數據從 dataframe 中找出過濾結果。
df1 df2
v1 v2 v1 v2
1 2 1 3
1 3 2 3
1 4 3 4
2 2
2 4
3 2
3 3
3 4
我有兩個數據框:df1 和 df2。 我正在嘗試創建 df3,它過濾掉如果 df1.v1 = df2.v1 和 df1.v2 < df2.v2 的結果。 這將在此處產生 df3:
df3
v1 v2
1 3
1 4
2 4
3 4
我不確定如何 go 這樣做。 我正在考慮將 df2 轉換為字典(df.v1 都是唯一的)。
您可以在v1
上合並 2 個數據框並過濾掉:
df3 = df1.merge(df2, on='v1', suffixes=('_', '')) \
.query("v2 <= v2_").drop(columns='v2_')
print(df3)
# Output
v1 v2
1 1 3
2 1 3
4 2 3
7 3 4
更新
如果您在v1
列之間沒有嚴格的相等性,您可以與how='cross'
merge
以創建所有組合:
df3 = df1.merge(df2, how='cross', suffixes=('_', '')) \
.query("(v1 == v1_) & (v2 <= v2_)").drop(columns=['v1_', 'v2_'])
print(df3)
# Output
v1 v2
3 1 3
6 1 3
13 2 3
23 3 4
您可以merge
v1,然后過濾 v2 值並清理中間列:
(df1.merge(df2, on='v1', suffixes=('_', ''))
.query('v2 <= v2_')
.drop(columns='v2_')
)
output:
v1 v2
1 1 3
2 1 3
4 2 3
7 3 4
在“v1”上merge
並使用 boolean 掩碼進行過濾:
merged_df = df1.merge(df2, on='v1', suffixes=('_df1', ''))
merged_df.loc[merged_df['v2_df1'] < merged_df['v2'], ['v1', 'v2']]
Output:
v1 v2
0 1 3.0
3 2 3.0
5 3 4.0
6 3 4.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.