簡體   English   中英

根據來自另一個數據幀的列值在數據幀中查找一行並對其應用過濾器

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

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