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
not
pd.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
not
pd.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)
代码中的问题

  • 您正在对df2进行两次压缩。(尽管这并不重要,因为您会删除重复项。)
  • 如果的参数未设置
    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)
    
    代码中的问题

  • 您正在对df2进行两次压缩。(尽管这并不重要,因为您会删除重复项。)
  • 如果的参数未设置
    subset
    ,默认情况下,pandas将使用所有列来标识重复项
  • 由于不需要
    extra
    列,因此可以使用布尔索引

    df1=df1.loc[~(df1['contact\u id'].isin(df2['contact\u id'])和(df1['subscription\u id'].isin(df2['subscription\u id']))