使用 pandas 分别合并 2 个不同数据帧的 2 个部分

Merge 2 parts of 2 different dataframes separately using pandas

提问人:Aries Ha 提问时间:10/28/2023 最后编辑:mozwayAries Ha 更新时间:10/28/2023 访问量:33

问:

假设我有 2 个数据帧:

第一个数据帧:

名字 val1 val2 名字 val1 val2
用户 1 1 2 用户3 3 4
用户 2 2 3 用户 1 3 3

第二个数据帧:

名字 val1 val2 名字 val1 val2
用户 1 3 2 用户4 2 1
用户 2 5 3 用户 1 1 5

我想合并这 2 个数据帧,以便生成的数据帧如下所示:

名字 val1 val2 名字 val1 val2
用户 1 4 4 用户 1 4 8
用户 2 7 6 用户3 3 4
用户4 2 1

因此,当合并 DataFrame 时,必须添加相同用户的值,并且 DataFrame 的左侧部分(即 Nan 值之前的部分)必须与右侧分开合并

我知道我可以通过将每个数据帧分成两部分并分别合并它们来做到这一点,但我想知道是否有更简单的方法可以做到这一点

Pandas 数据帧 合并

评论


答:

2赞 mozway 10/28/2023 #1

如果只有两边,拆分似乎是最简单的方法:

tmp1 = (pd.concat([df1.iloc[:, :4], df2.iloc[:, :4]])
          .groupby('names', as_index=False)
          .agg({'val1': 'sum', 'val2': 'sum', 'Nan': 'first'})
       )
tmp2 = (pd.concat([df1.iloc[:, 4:], df2.iloc[:, 4:]])
          .groupby('names', as_index=False).sum()
       )

out = pd.concat([tmp1, tmp2], axis=1)

输出:

   names  val1  val2  Nan  names  val1  val2
0  user1   4.0   4.0  Nan  user1     4     8
1  user2   7.0   6.0  Nan  user3     3     4
2    NaN   NaN   NaN  NaN  user4     2     1

处理任意数量的列组的通用方法要复杂得多:

def dedup(df):
    c = df.columns.to_series().groupby(level=0).cumcount()
    return df.set_axis(pd.MultiIndex.from_arrays([df.columns, c]), axis=1)

out = (pd.concat([dedup(df1).stack(),
                  dedup(df2).stack()])
         .drop(columns='Nan')
         .set_index('names', append=True)
         .groupby(level=[0,1,2]).sum()
         .reset_index('names')
         .assign(n=lambda d: d.groupby(level=[0,1]).cumcount())
         .set_index('n', append=True).assign(Nan=float('nan'))
         .unstack(level=1).sort_index(axis=1, level=1, sort_remaining=False)
         .sort_index(level=[1, 0])
         .iloc[:, :-1].reset_index(drop=True).droplevel(1, axis=1)
      )

评论

0赞 Aries Ha 10/28/2023
是的,我在数据框中只有两面,非常感谢!!另外,如果可能的话,您能解释一下第二种方法如何适用于多个零件吗?我是熊猫的新手
1赞 mozway 10/28/2023
第二个检测重复的标题,将数据帧重新调整为长格式,合并并重新调整回原始格式。如果您想查看它是如何工作的,请逐行注释外部和取消注释之间的所有内容。(...)
0赞 Aries Ha 10/29/2023
谢谢!我还有一个问题,concat函数会自动对数据进行排序吗?因为即使我们没有调用sort_values数据似乎也会根据名称列自动排序
1赞 mozway 10/30/2023
@AriesHa没有,但确实如此,您可以通过保留原始订单groupbysort=False