[英]How to filter row dataframe based on value of another dataframe
[英]Find a row in a dataframe based on a column value from another dataframe and apply filter to it
我有兩個數據框 df1 和 df2。
df1 = pd.DataFrame({'type_id' : [1,2,3,4,3], 'count' : [12,11,15,16,2], 'unique_id' : ['1|12','2|11','3|15','4|16','3|2']})
df2 = pd.DataFrame({'type_id' : [1,3,76,12,11,1], 'count' : [8,6,15,16,5,17], 'col3' : [1,5,7,3,4,7], 'unique_id' : ['1|8','3|6','76|12','12|16','11|5','1|17']})
df1
type_id count unique_id
0 1 12 1|12
1 2 11 2|11
2 3 15 3|15
3 4 16 4|16
4 3 2 3|2
df2
type_id count col3 unique_id
0 1 8 1 1|8
1 3 6 5 3|6
2 76 15 7 76|12
3 12 16 3 12|16
4 11 5 4 11|5
5 1 17 7 1|17
這里,unique_id 是 type_id 和 count 的組合。
現在,我想從 df2 中檢索行,其中df2['type_id'] == df1['id'] & df2['count']<df1['count']
即,我想要兩個 id 匹配且 df2 中相應計數小於 df1 計數的行
預期輸出:
type_id count col3 unique_id
0 1 8 1 1|8
1 3 6 5 3|6
當我嘗試直接執行此操作時,出現錯誤:
Can only compare identically-labeled Series objects
如何執行此操作? 提前致謝。
使用Series.map
匹配id
列以獲得與df2
相同長度的Series
,因此可以通過df2['count']
進行比較並通過boolean indexing
過濾:
df = df2[df2['count'] < df2['type_id'].map(df1.set_index('type_id')['count'])]
print (df)
type_id count col3 unique_id
0 1 8 1 1|8
1 3 6 5 3|6
詳情:
print (df2['type_id'].map(df1.set_index('type_id')['count']))
0 12.0
1 15.0
2 NaN
3 NaN
4 NaN
5 12.0
Name: type_id, dtype: float64
編輯:因為df1['type_id']
重復項可以通過unique_id
的鏈計數器列創建唯一的GroupBy.cumcount
:
df1 = pd.DataFrame({'type_id' : [1,1,1,4], 'count' : [12,11,15,16]})
df2 = pd.DataFrame({'type_id' : [1,3,76,12,11,1],
'count' : [8,6,15,16,5,17], 'col3' : [1,5,7,3,4,7]})
df1['unique_id1'] = (df1['type_id'].astype(str) + '|' +
df1.groupby('type_id').cumcount().astype(str))
df2['unique_id1'] = (df2['type_id'].astype(str) + '|' +
df2.groupby('type_id').cumcount().astype(str))
print (df1)
type_id count unique_id1
0 1 12 1|0
1 1 11 1|1
2 1 15 1|2
3 4 16 4|0
print (df2)
type_id count col3 unique_id1
0 1 8 1 1|0
1 3 6 5 3|0
2 76 15 7 76|0
3 12 16 3 12|0
4 11 5 4 11|0
5 1 17 7 1|1
df = df2[df2['count'] < df2['unique_id1'].map(df1.set_index('unique_id1')['count'])]
print (df)
type_id count col3 unique_id
0 1 8 1 1|0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.