【发布时间】:2017-11-07 13:58:27
【问题描述】:
我有两个数据框:
df1 = (data = {'Invoice' : [1, 2, 3, 4, 5],
'Value' : [10, 25, 40, 10, 15]})
Invoice Value Param
0 1 10 0
1 2 25 0
2 3 40 0
3 4 10 0
4 5 15 0
df2 = (data = {'Invoice' : [2, 3, 5, 2],
'Value' : [25, 15, 15,25],
'TestData': ["A",'B','C','D']})
Invoice TestData Value Param
0 2 A 25 0
1 3 B 15 0
2 5 C 15 0
3 2 D 25 1
我不想将 df2 中的 2 号发票与 df1 中的单次合并两次,所以:
df1["Param"]=df1.groupby(["Invoice","Value"]).cumcount()
df2["Param"]=df2.groupby(["Invoice","Value"]).cumcount()
合并后:
df3 = (df1,df2, left_on=["Invoice","Value","Param"], right_on=["Invoice","Value","Param"])`
有最终的、合并的、数据框:
Invoice Value Param TestData
0 2 25 0 A
1 5 15 0 C
现在我想从 df1 获取未合并的数据:
df1[(~df1.Invoice.isin(df3.Invoice))&(~df1.Value.isin(df3.Value))]`
它适用于 df1:
Invoice Value Param
0 1 10 0
2 3 40 0
3 4 10 0
但结果为空数据帧的 df2 失败:
df2[(~df2.Value.isin(df3.Value))&(~df2.Invoice.isin(df3.Invoice))]`
就我检查这一点而言,我认为比较运行“两次”而不是一次(& 运算符) - 首先检查每张发票的代码编号,然后再次独立检查值而不是检查同时满足两个条件。
你知道如何以这种形状获得未合并的 df2:
Invoice TestData Value Param
1 3 B 15 0
3 2 D 25 1
【问题讨论】:
标签: python pandas dataframe merge