[英]Pandas aggregating across multiple columns
我有以下数据框
import pandas as pd
import numpy as np
from IPython.display import display
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
df = pd.DataFrame({'A': np.arange(8),
'B': np.arange(8),
'C': np.arange(8)},
index=index)
df
我现在想要一个数据框,其内容是“第一个”组下所有元素的总和,即
<!DOCTYPE html> <html> <head> <style> table, th, td { border: 1px solid black; } </style> </head> <body> <table style="width:100%"> <tr> <th>first</th> <th>sum</th> </tr> <tr> <td>bar</td> <td>3</td> </tr> <tr> <td>baz</td> <td>15</td> </tr> <tr> <td>foo</td> <td>27</td> </tr> <tr> <td>qux</td> <td>39</td> </tr> </table> </body> </html>
我尝试了以下代码
grouped = df.groupby([pd.Grouper(level='first')])
grouped.sum(axis='columns')
但这抱怨“ f()收到了意外的关键字参数'axis'”。 有没有一种方法可以通过抑制索引之一来在多索引数据帧上运行聚合函数?
方式1
这段代码
grouped = df.reset_index().groupby('first').sum()
sum_by_columns = grouped.sum(axis=1).to_frame()
sum_by_columns.columns = ['sum']
print(sum_by_columns)
将提供您想要的输出
sum
first
bar 3
baz 15
foo 27
qux 39
这里的士气是grouped.sum()分别适用于每一列。
方式2
您可以使用自己的聚合函数:
sum_by_columns = df.groupby([pd.Grouper(level='first')]).apply(lambda x: x.sum().sum())
sum_by_columns.columns = ['sum']
print(sum_by_columns)
它将导致您获得相同的结果。 在此,lambda并不应用于每一列,而是应用于每个部分数据帧。
方式3
如果您需要跨列聚合,则可以首先使用df.stack()
方法将它们转换为行:
sum_by_columns = df.stack().groupby(pd.Grouper(level='first')).sum().to_frame()
sum_by_columns.columns = ['sum']
print(sum_by_columns)
df.groupby(by="first").sum() will give you, (by="w/e you want them to be group by")
A B C
first
bar 1 1 1
baz 5 5 5
foo 9 9 9
qux 13 13 13
df.groupby(by="first").sum().sum(axis=1) will give you
first
bar 3
baz 15
foo 27
qux 39
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.