根据特定的列信息合并两个数据帧

时间:2017-05-04 15:06:52

标签: python pandas dictionary dataframe

我试图以多种方式处理数据帧。 现在我想基于特定的列信息合并两个数据帧并删除重复的行

有可能吗? 我尝试使用Concatenate函数但是没有成功......

例如,如果我想将df1和df2与

合并到d3中

条件:

  • 如果c1和c2信息相同,则删除重复的行(仅使用df1,即使df1和df2之间的c3数据不同)
  • 如果c1和c2信息不同,请同时使用两行(df1,df2)

之前:

df1
 c1  c2  c3
0    0   x  {'a':1 ,'b':2} 
1    0   y  {'a':3 ,'b':4}
2    2   z  {'a':5 ,'b':6}

df2
     c1  c2  c3
0    0   x  {'a':11 ,'b':12}
1    0   y  {'a':13 ,'b':14}
2    3   z  {'a':15 ,'b':16}

预期结果d3:

    c1  c2  c3
0    0   x  {'a':1 ,'b':2}
1    0   y  {'a':3 ,'b':4}
2    2   z  {'a':5 ,'b':6}
3    3   z  {'a':15 ,'b':16}

在这里输入代码

1 个答案:

答案 0 :(得分:0)

首先,您可以使用merge确定哪些行仅在df2中,然后通过how='right'indicator=True,然后将concatdf1一起传递来执行此操作:

In [125]:
merged = df1.merge(df2, left_on=['c1','c2'], right_on=['c1','c2'], how='right', indicator=True)
merged = merged[merged['_merge']=='right_only']
merged = merged.rename(columns={'c3_y':'c3'})
merged

Out[125]:
   c1 c2 c3_x                c3      _merge
2   3  z  NaN  {'a':15 ,'b':16}  right_only

In [126]:    
combined = pd.concat([df1, merged[df1.columns]])
combined

Out[126]:
   c1 c2                c3
0   0  x    {'a':1 ,'b':2}
1   0  y    {'a':3 ,'b':4}
2   2  z    {'a':5 ,'b':6}
2   3  z  {'a':15 ,'b':16}

如果我们分解以上内容:

In [128]:
merged = df1.merge(df2, left_on=['c1','c2'], right_on=['c1','c2'], how='right', indicator=True)
merged

Out[128]:
   c1 c2            c3_x              c3_y      _merge
0   0  x  {'a':1 ,'b':2}  {'a':11 ,'b':12}        both
1   0  y  {'a':3 ,'b':4}  {'a':13 ,'b':14}        both
2   3  z             NaN  {'a':15 ,'b':16}  right_only

In [129]:
merged = merged[merged['_merge']=='right_only']
merged

Out[129]:
   c1 c2 c3_x              c3_y      _merge
2   3  z  NaN  {'a':15 ,'b':16}  right_only

In [130]:
merged = merged.rename(columns={'c3_y':'c3'})
merged

Out[130]:
   c1 c2 c3_x                c3      _merge
2   3  z  NaN  {'a':15 ,'b':16}  right_only