【问题标题】:merge two dataframe based on specific column information根据特定列信息合并两个数据框
【发布时间】:2017-05-04 15:06:51
【问题描述】:

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

有可能吗? 我尝试使用 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}

在此处输入代码

【问题讨论】:

  • 合并功能怎么样?

标签: python pandas dictionary dataframe


【解决方案1】:

您可以首先通过使用merge 并通过how='right'indicator=True 确定哪些行仅在df2 中,然后通过concatdf1 传递concat

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 2022-01-18
    • 2015-10-28
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    相关资源
    最近更新 更多