根据某些列名称汇总不同数据框中的列

时间:2018-07-09 13:18:36

标签: python pandas dataframe

假设我有一个主数据框

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行。

还有其他解决方法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

然后您有几个选择。

concat + groupby

您可以将groupbysum串联,然后执行:

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