Python 如何根据列从数据帧中减去数据帧?
我有下面的数据帧Python 如何根据列从数据帧中减去数据帧?,python,pandas,dataframe,Python,Pandas,Dataframe,我有下面的数据帧 df1 = pd.DataFrame({ 'contact_id': [1,3,4,5,-1], 'subscription_id': ['AAA', 'ccc', 'ddd', 'eee', 'fff'] }); print(df1) contact_id subscription_id 0 1 AAA 1 3 ccc 2 4
df1 = pd.DataFrame({
'contact_id': [1,3,4,5,-1],
'subscription_id': ['AAA', 'ccc', 'ddd', 'eee', 'fff']
});
print(df1)
contact_id subscription_id
0 1 AAA
1 3 ccc
2 4 ddd
3 5 eee
4 -1 fff
第二数据帧
df2 = pd.DataFrame({
'contact_id': [1,2,-1],
'subscription_id': ['AAA', 'bbb', 'fff'],
'extra': ['we', 'kl', 'op']
});
print(df2)
contact_id subscription_id extra
0 1 AAA we
1 2 bbb kl
2 -1 fff op
预期产出
contact_id subscription_id extra
1 3 ccc NaN
2 4 ddd NaN
3 5 eee NaN
我的代码
import pandas as pd
df1 = pd.DataFrame({
'contact_id': [1,3,4,5,-1],
'subscription_id': ['AAA', 'ccc', 'ddd', 'eee', 'fff']
});
print(df1)
df2 = pd.DataFrame({
'contact_id': [1,2,-1],
'subscription_id': ['AAA', 'bbb', 'fff'],
'extra': ['we', 'kl', 'op']
});
print(df2)
sub = pd.concat([df1, df2, df2]).drop_duplicates(keep=False)
print(sub)
有人能告诉我哪里做错了吗?你想要的基本上是
左连接的结果
减去内部连接的结果
。这看起来像是merge
notpd.concat
的典型案例
与左侧
连接并将指示器
列作为真
使用。仅通过选择左(仅)(仅限左))来拾取df1
中存在的行:
In [1586]: df1.merge(df2, how='left', indicator=True).query('_merge == "left_only"').drop('_merge', 1)
Out[1586]:
contact_id subscription_id extra
1 3 ccc NaN
2 4 ddd NaN
3 5 eee NaN
您想要的基本上是
左连接的结果
减去内部连接的结果
。这看起来像是merge
notpd.concat
的典型案例
与左侧
连接并将指示器
列作为真
使用。仅通过选择左(仅)(仅限左))来拾取df1
中存在的行:
In [1586]: df1.merge(df2, how='left', indicator=True).query('_merge == "left_only"').drop('_merge', 1)
Out[1586]:
contact_id subscription_id extra
1 3 ccc NaN
2 4 ddd NaN
3 5 eee NaN
sub=pd.concat([df1,df2,df2])。删除重复项(keep=False)
代码中的问题
subset
,默认情况下,pandas将使用所有列来标识重复项extra
列,因此可以使用布尔索引
df1=df1.loc[~(df1['contact\u id'].isin(df2['contact\u id'])和(df1['subscription\u id'].isin(df2['subscription\u id']))
sub=pd.concat([df1,df2,df2])。删除重复项(keep=False)
代码中的问题
subset
,默认情况下,pandas将使用所有列来标识重复项extra
列,因此可以使用布尔索引
df1=df1.loc[~(df1['contact\u id'].isin(df2['contact\u id'])和(df1['subscription\u id'].isin(df2['subscription\u id']))