根据某些列名对来自不同数据帧的列求和

2024-09-29 19:31:47 发布

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

假设我有一个主数据帧

main_df

  Cri1  Cri2   Cr3  total
0   A1    A2    A3  4
1   B1    B2    B3  5
2   C1    C2    C3  6

我还有3个数据帧

df_1

      Cri1   Cri2  Cri3 value
    0   A1    A2    A3  1
    1   B1    B2    B3  2

df_2
      Cri1  Cri2  Cri3  value
    0   A1    A2    A3  9
    1   C1    C2    C3  10

df_3
      Cri1  Cri2  Cri3  value
    0   B1    B2    B3  15
    1   C1    C2    C3  17

我想要的是根据Cri将每个帧的值df加到main_df中的总数中 i、 e.主数据框将变为

主数据框

      Cri1  Cri2  Cri3  total
    0   A1    A2    A3  14
    1   B1    B2    B3  22
    2   C1    C2    C3  33

当然,我可以使用for循环来完成,但最后我想将该方法应用于大量数据,比如每个数据帧中的50000行

还有别的办法解决吗

谢谢你


Tags: 数据a2dfvaluea1b2a3b1
1条回答
网友
1楼 · 发布于 2024-09-29 19:31:47

首先,应该对齐数字列名。在这种情况下:

df_main = df_main.rename(columns={'total': 'value'})

然后你有几个选择

concat+groupby

您可以连接然后用sum执行groupby

res = pd.concat([df_main, df_1, df_2, df_3])\
        .groupby(['Cri1', 'Cri2', 'Cri3']).sum()\
        .reset_index()

print(res)

  Cri1 Cri2 Cri3  value
0   A1   A2   A3     14
1   B1   B2   B3     22
2   C1   C2   C3     33

设置索引+减少/添加

或者,您可以创建按条件列索引的数据帧列表。然后使用^{}^{}对这些数据帧求和

from functools import reduce

dfs = [df.set_index(['Cri1', 'Cri2', 'Cri3']) for df in [df_main, df_1, df_2, df_3]]

res = reduce(lambda x, y: x.add(y, fill_value=0), dfs).reset_index()

print(res)

  Cri1 Cri2 Cri3  value
0   A1   A2   A3   14.0
1   B1   B2   B3   22.0
2   C1   C2   C3   33.0

相关问题 更多 >

    热门问题