在 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'])
数据帧 df1
和 df2
与您的 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
请注意,如果两个数据帧 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
假设我在 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'])
数据帧 df1
和 df2
与您的 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
请注意,如果两个数据帧 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