让我们说我在熊猫中有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循环来执行此操作,但是我希望可以有一种更有效的方法。
答案 0 :(得分:1)
对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
。)
答案 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'])
数据帧df1
和df2
与您的帖子相同。要以所需的方式“联接”数据框,可以执行以下操作:
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
请注意,如果两个数据帧df1
和df2
的索引未对齐,这也将起作用。使用:
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