簡體   English   中英

Pandas 根據另一個數據幀中的值過濾一個 dataframe 中的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM