检查是否在其他熊猫数据框中找到两个列值

时间:2019-02-08 08:54:18

标签: python pandas dataframe

设置

我有2个熊猫dfs(df1和df2),其中包含一些重叠的行和一些不重叠的行。

两个df都有order_idshop列。

现在,如果df1行与order_idshop组合上的df2行匹配,则没有任何结果。但是,如果df1行与order_idshop组合上的df2行不匹配,则应将此df1行添加到df2中。


示例

df2就是

    order_id    shop
0     12345     'NL'
1     45678     'FR'
2     12345     'DE'
3     34567     'NL'

现在,如果df1这样,

    order_id    shop
0     12345     'NL'
1     45678     'FR'

然后什么都没有。


但是如果df1这样,

        order_id    shop
0       12345       'NL'
1       99999       'FR'
2       12345       'UK'

然后,即使第1行的df2值和第2行的shop值已经在order_id中,第1行和第2行也应添加到df2中。

生成的df2应该看起来像

    order_id    shop
0     99999     'FR'
1     12345     'UK'        
2     12345     'NL'
3     45678     'FR'
4     12345     'DE'
5     34567     'NL' 

请注意,order_id列为int,shop列为string。

所以从图形上来说,我想要实现的目标是:

enter image description here

代码

我创建了一个怪异的行,然后就没用了...

到目前为止,我有

result_df = df1[(~df1['order_id'].astype(str).isin(df2['order_id'].astype(str)))]

我该如何解决?


额外

如果df1这样,

        order_id    shop
0       12345       'NL'
1       99999       'FR'
2       12345       'UK'

如何比较df1df2,以便得到df3

        order_id    shop
0       99999       'FR'
1       12345       'UK'

2 个答案:

答案 0 :(得分:3)

如果所有行都是唯一的,请将concatdrop_duplicates结合使用:

SELECT distinct ("details"->>'offers'->>'offer_value_id') as "identifier", ("details"->>'offers'->>'offer_value_name') as "name" 
    FROM houses 
    WHERE "details"->>'offers'->>'offer_id' = '2'
    order by "details"->>'offers'->>'offer_value_name' asc 

如果不是唯一过滤器,则过滤器将merge的行与df = pd.concat([df2, df1], ignore_index=True).drop_duplicates() print (df) order_id shop 0 12345 'NL' 1 45678 'FR' 2 12345 'DE' 3 34567 'NL' 5 99999 'FR' 6 12345 'UK' 相等,然后将indicator=Trueconcat

df2

答案 1 :(得分:0)

您是否希望创建一组所有可能的组合?如果是这样,您可以使用以下方法创建唯一对:

import pandas as pd

data1 = {'order_id': [12345, 45678, 78901, 12345, 12901, 12345], 'shop': ['NL', 'FR', 'AB', 'AB', 'NL', 'NL']}
df1 = pd.DataFrame(data=data1)

data2= {'order_id': [12345, 45678, 12345, 34567], 'shop': ['NL', 'FR', 'DE', 'NL']}
df2 = pd.DataFrame(data=data2)

df3 = df1
df3['Combi'] = df3['order_id'].astype('str') + df3['shop']
df3.drop_duplicates('Combi', inplace=True)

df1 df3