Pandas数据框,Groupby来自DF1,Sum来自其他df

k2fxgqgv  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(221)

我得到了这两个 Dataframe :
DF1:

A      |  B   | C
2023-10-31 | foo  | bar
2023-11-30 | foo  | bar
2023-12-31 | foo  | bar
...

DF2:

D      | E   | F
2023-10-31 | 23  | bar
2023-10-31 | 25  | bar
2023-10-31 | 34  | bar
...

我想对groupby()A求和,然后对E列求和,问题是两个 Dataframe 中的日期数量不同(df2中少了一个)
我试过:

df1["D"] = df2.groupby(["D"]).agg({"E": sum}).values

这导致:
ValueError:值的长度与索引的长度不匹配
我唯一的其他想法是将iterrows()iloc一起使用

uemypmqf

uemypmqf1#

这就是Pandas的索引。在Pandas中有两种(相关的)方法来分配列。你可以一个元素接一个元素地对齐行的长度,或者你可以对齐索引标签。考虑下面的数据框。

pd.DataFrame({'A': [1, 2, 3], 'B': [7, 8, 9]}).set_index('A')

你可以通过分配一个列表来添加一列,但是只有当你有相同的长度时,这才有效。这似乎是你现在遇到的问题。

>>> df['C'] = [4, 5, 6]
   B  C
A      
1  7  4
2  8  5
3  9  6

>>> df['C'] = [4, 5, 6, 7]
ValueError: Length of values (4) does not match length of index (3)

或者你也可以通过对齐索引来实现,这将只分配那些索引匹配的元素。看看临时数据框是如何不拉过索引为4和5的元素的:

>>> df['C'] = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'D': [4, 5, 6, 7, 8]}).set_index('A')
   B  C
A      
1  7  4
2  8  5
3  9  6

在您的示例中,您尝试基于第一种方法赋值,如果长度不同,则该方法将失败。
您希望按日期对齐,这将要求您将df1中的索引设置为列A。要按索引对齐,您还必须在两个数据框中具有 * 相同 * 的索引类型。然后,您可以直接附加groupby创建的索引中的相应值。因此:

df1.set_index('A', inplace=True)
df1['D'] = df2.groupby('D')['E'].sum()
9ceoxa92

9ceoxa922#

使用map对齐A上groupby操作的输出:

df1['D'] = df1['A'].map(df2.groupby(['D'])['E'].sum())

输出:

A    B    C     D
0  2023-10-31  foo  bar  82.0
1  2023-11-30  foo  bar   NaN
2  2023-12-31  foo  bar   NaN

如果输出的是DataFrame,则可以合并:

out = df1.merge(df2.groupby(['D']).agg({'E': 'sum'}), left_on='A', right_index=True, how='left')

输出:

A    B    C     E
0  2023-10-31  foo  bar  82.0
1  2023-11-30  foo  bar   NaN
2  2023-12-31  foo  bar   NaN

相关问题