在 Pandas 中加入数据框并对列求和

Join Dataframes in Pandas and Sum Columns

假设我在 pandas 中有 2 个数据帧。我想以一种非常具体的方式对这些数据帧执行左连接,如下所示,最简单的解释方式可能是通过示例。

第一个数据帧:

日期第 1 列第 2
1/1
2/1
...

第二个数据框:

日期 A B C
1/1 90 0 0
1/1 0 75 0
1/1 73 0 0
2/1 0 0 85
2/1 0 0 75

第一个数据框中的日期是唯一的,将用于连接到第二个数据框中。 Col1 和 Col2 不是空白,但它们与我想做的事情无关。在第二个数据框中,一个日期可以出现多次,并且 A、B 和 C 列中只有一列包含大于 0 的数字,另外两列包含 0。还可能有一些与什么无关的额外列我想做。

我想将所有内容都保留在第一个数据框中,并添加 A、B 和 C 列,使这些列中的值将是第二个数据框中给定数据的所有值的总和。所以在上面的例子中,我希望输出看起来像这样:

日期 Col1 Col2 A B C
1/1 163 75 0
2/1 0 0 160
...

我查看了 pandas 连接函数,但它似乎没有提供按我想要的方式对列求和的选项。还有其他方法可以达到这样的结果吗?我意识到我可以编写一个 for 循环来执行此操作,但我希望可能有更有效的方法。

对 df1 进行 groupby 求和,merge 结果 df0:

In [127]: df1.groupby("Date", as_index=False).sum()
Out[127]: 
  Date    A   B    C
0  1/1  163  75    0
1  2/1    0   0  160

In [128]: df0.merge(df1.groupby("Date", as_index=False).sum())
Out[128]: 
  Date  Col1  Col2    A   B    C
0  1/1   NaN   NaN  163  75    0
1  2/1   NaN   NaN    0   0  160

(我在这里假设 Date 是一列,而不是索引,但很容易 reset_index() 或使用 level=0 代替。)

import pandas as pd

df1 = pd.DataFrame({'Col1': [1, 2], 'Col2': [3, 4]}, index=['1/1', '2/1'])
df2 = pd.DataFrame({'A': [90, 0, 73, 0, 0], 'B': [0, 75, 0, 0, 0], 'C': [0, 0, 0, 85, 75]}, index=['1/1', '1/1', '1/1', '2/1', '2/1'])

数据帧 df1df2 与您的 post 相同。要按照您想要的方式 "join" 数据帧,您可以执行以下操作:

df = pd.concat([df1, df2.groupby(level=0).sum()], axis=1)

这里,df是:

     Col1  Col2  A   B    C
1/1  1     3     163 75   0
2/1  2     4     0   0    160

请注意,如果两个数据帧 df1df2 的索引未对齐,这也适用。有:

df3 = pd.DataFrame({'Col1': [1, 2, 3], 'Col2': [3, 4, 5]}, index=['1/1', '2/1', '4/1'])
df4 = pd.DataFrame({'A': [90, 0, 73, 0, 0, 20], 'B': [0, 75, 0, 0, 0, 0], 'C': [0, 0, 0, 85, 75, 0]}, index=['1/1', '1/1', '2/1', '3/1', '4/1', '4/1'])

并且,再次:

df = pd.concat([df1, df2.groupby(level=0).sum()], axis=1, sort=True)

由以下人员提供:

     Col1  Col2  A   B   C
1/1  1.0   3.0   90  75  0
2/1  2.0   4.0   73  0   0
3/1  NaN   NaN   0   0   85
4/1  3.0   5.0   20  0   75