假设我有一个主数据框

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的总计中
即main_df将成为

main_df

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


当然我可以使用for循环来做到这一点,但是最后我想将该方法应用于大量数据,例如每个数据帧中有50000行。

还有其他解决方法吗?

谢谢!

最佳答案

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

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


然后,您有两个选择。

concat + groupby

您可以连接并使用groupby执行sum

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


set_index +减少/增加

或者,您可以创建一个按条件列索引的数据框列表。然后将functools.reducepd.DataFrame.add一起使用以总计这些数据帧。

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

关于python - 根据某些列名称汇总不同数据框中的列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51246570/

10-12 16:56
查看更多