设置
我有2个熊猫dfs(df1和df2),其中包含一些重叠的行和一些不重叠的行。
两个df都有order_id
和shop
列。
现在,如果df1行与order_id
和shop
组合上的df2行匹配,则没有任何结果。但是,如果df1行与order_id
和shop
组合上的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。
所以从图形上来说,我想要实现的目标是:
代码
我创建了一个怪异的行,然后就没用了...
到目前为止,我有
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'
如何比较df1
和df2
,以便得到df3
,
order_id shop
0 99999 'FR'
1 12345 'UK'
答案 0 :(得分:3)
如果所有行都是唯一的,请将concat
与drop_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=True
到concat
:
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)