在Pandas和Sum列中联接数据框

时间:2018-09-19 14:53:31

标签: python pandas data-cleaning

让我们说我在熊猫中有2个数据帧。我想以一种非常特定的方式对这些数据框执行左联接,如下所示,而最简单的解释方法可能是通过示例。

第一个数据帧:

日期Col1 Col2
1/1
2/1
...

第二个数据框:

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

第一个数据框中的日期是唯一的,将用于加入第二个数据框中。 Col1和Col2并非空白,但与我要执行的操作无关。在第二个数据帧中,日期可能会出现多次,并且A,B和C列之一恰好包含一个大于0的数字,其他两个列包含0。也可能有一些多余的列与这些内容无关我想做。

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

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

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

2 个答案:

答案 0 :(得分:1)

对df1做一个groupby的总和,并用mergedf0的结果:

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

答案 1 :(得分:1)

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与您的帖子相同。要以所需的方式“联接”数据框,可以执行以下操作:

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