我在从 R 转换到 pandas 时遇到问题,其中 dplyr
包可以轻松分组并执行多个摘要。
请帮助改进我现有的用于多个聚合的 Python pandas 代码:
import pandas as pd
data = pd.DataFrame(
{'col1':[1,1,1,1,1,2,2,2,2,2],
'col2':[1,2,3,4,5,6,7,8,9,0],
'col3':[-1,-2,-3,-4,-5,-6,-7,-8,-9,0]
}
)
result = []
for k,v in data.groupby('col1'):
result.append([k, max(v['col2']), min(v['col3'])])
print pd.DataFrame(result, columns=['col1', 'col2_agg', 'col3_agg'])
问题:
- 太冗长
- 可能可以优化和高效。 (我将
for-loop groupby
实现重写为groupby.agg
并且性能得到了巨大的提升)。
在 R 中,等效代码为:
data %>% groupby(col1) %>% summarize(col2_agg=max(col2), col3_agg=min(col3))
更新:@ayhan 解决了我的问题,这是一个后续问题,我将在此处发布而不是作为评论:
Q2) 什么等同于 groupby().summarize(newcolumn=max(col2 * col3))
即函数是 2+ 列的复合函数的聚合/汇总?
原文由 B.Mr.W. 发布,翻译遵循 CC BY-SA 4.0 许可协议
相当于
是
返回
返回的对象是一个 pandas.DataFrame,其索引名为
col1
,列名为col2
和col3
。默认情况下,当您对数据进行分组时,pandas 将分组列设置为索引以进行高效访问和修改。但是,如果您不希望这样,则有两种选择可以将col1
设置为一列。as_index=False
:reset_index
:两者都产生
您还可以将多个函数传递给
groupby.agg
。这也会返回一个 DataFrame,但现在它有一个用于列的 MultiIndex。
MultiIndex 对于选择和分组非常方便。这里有些例子:
早期( 版本 0.20.0 之前)可以使用字典重命名
agg
调用中的列。例如将第二列的最大值返回为
max_col2
:但是,它已被弃用,取而代之的是重命名方法:
对于上面定义的
agg_df
之类的 DataFrame,它可能会变得冗长。在这种情况下,您可以使用重命名函数来展平这些级别:对于
groupby().summarize(newcolumn=max(col2 * col3))
类的操作,您仍然可以通过首先使用assign
添加一个新列来使用 agg。这将返回旧列和新列的最大值,但一如既往,您可以对其进行切片。
使用
groupby.apply
这会更短:但是,
groupby.apply
将其视为自定义函数,因此未对其进行矢量化。到目前为止,我们传递给agg
的函数(’min’、’max’、’min’、’size’ 等)是向量化的,这些是那些优化函数的别名。 You can replacedf.groupby('col1').agg('min')
withdf.groupby('col1').agg(min)
,df.groupby('col1').agg(np.min)
ordf.groupby('col1').min()
and they will all execute the same function.使用自定义函数时,您将看不到同样的效率。最后,从 0.20 版开始,
agg
可以直接在 DataFrame 上使用,而无需先进行分组。请参阅 此处 的示例。