基于特定列信息合并两个数据帧

2024-04-23 07:36:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试用几种方法处理数据帧。 现在我想根据特定的列信息合并两个数据帧,并删除重复的行

有可能吗? 我试图使用连接函数,但失败了。。。你知道吗

例如,如果我想用

条件:

  • 如果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}

在此处输入代码


Tags: 数据方法函数代码信息条件d3df1
1条回答
网友
1楼 · 发布于 2024-04-23 07:36:48

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

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

相关问题 更多 >