Pandas使用DataFrame对Series进行分组
我想把一个序列(Series)按照一个数据框(DataFrame)进行分组,然后像下面的例子那样进行一些计算:
In [1]: from pandas import DataFrame
In [2]: df = DataFrame([['Alice', 'F', 100, 1],
['Alice', 'F', 100, 3],
['Drew', 'F', 100, 4],
['Drew', 'M', 100, 5],
['Drew', 'M', 200, 5]],
columns=['name', 'sex', 'amount', 'id'])
In [3]: df['amount'].groupby(df[['name', 'sex']]).count()
可惜的是,这样做会出现一个让我困惑的类型错误(TypeError):
TypeError: 'DataFrame' object is not callable
我知道我可以直接使用列名,但我实际的计算需要更灵活一些,所以我觉得这样做应该是可以的。到底发生了什么呢?怎样才能通过一个任意的数据框来正确地进行分组和计算呢?或者说,根本就没有这样的方式吗?
1 个回答
0
一种解决方案是把这个序列(Series)变成一个数据框(DataFrame),然后和一个分组的数据框(grouper DataFrame)合并,再根据分组的数据框的列进行分组,最后重新选择分组后的列。也就是说:
# Example inputs
pregrouped = df['amount']
grouper = df[['name', 'sex']]
# General computation
pregrouped = DataFrame(pregrouped)
grouper = DataFrame(grouper)
full = grouper.join(pregrouped)
groups = full.groupby(list(grouper.columns))[list(pregrouped.columns)]
result = groups.some_reduction()[list(pregrouped.columns)].reset_index()
这样做有没有什么特别浪费的地方?这个方法的运行速度大约和常见情况下的标准计算速度差不多。