相当于
df %>% groupby(col1) %>% summarize(col2_agg=max(col2), col3_agg=min(col3))
是
df.groupby('col1').agg({'col2': 'max', 'col3': 'min'})
返回
col2 col3
col1
1 5 -5
2 9 -9
返回的对象是一个 pandas.DataFrame,其索引名为andcol1
列。默认情况下,当您对数据进行分组时,pandas 会将分组列设置为索引,以便高效访问和修改。但是,如果您不希望这样,有两种方法可以设置为列。col2
col3
col1
通过as_index=False
:
df.groupby('col1', as_index=False).agg({'col2': 'max', 'col3': 'min'})
致电reset_index
:
df.groupby('col1').agg({'col2': 'max', 'col3': 'min'}).reset_index()
两者都有
col1 col2 col3
1 5 -5
2 9 -9
您还可以将多个函数传递给groupby.agg
.
agg_df = df.groupby('col1').agg({'col2': ['max', 'min', 'std'],
'col3': ['size', 'std', 'mean', 'max']})
这也返回了一个 DataFrame,但现在它有一个用于列的 MultiIndex。
col2 col3
max min std size std mean max
col1
1 5 1 1.581139 5 1.581139 -3 -1
2 9 0 3.535534 5 3.535534 -6 0
MultiIndex 对于选择和分组非常方便。这里有些例子:
agg_df['col2'] # select the second column
max min std
col1
1 5 1 1.581139
2 9 0 3.535534
agg_df[('col2', 'max')] # select the maximum of the second column
Out:
col1
1 5
2 9
Name: (col2, max), dtype: int64
agg_df.xs('max', axis=1, level=1) # select the maximum of all columns
Out:
col2 col3
col1
1 5 -1
2 9 0
早期(在0.20.0 版本之前)可以使用字典来重命名agg
调用中的列。例如
df.groupby('col1')['col2'].agg({'max_col2': 'max'})
将返回第二列的最大值为max_col2
:
max_col2
col1
1 5
2 9
但是,它已被弃用,取而代之的是 rename 方法:
df.groupby('col1')['col2'].agg(['max']).rename(columns={'max': 'col2_max'})
col2_max
col1
1 5
2 9
agg_df
对于上面定义的 DataFrame,它可能会变得冗长。在这种情况下,您可以使用重命名函数来展平这些级别:
agg_df.columns = ['_'.join(col) for col in agg_df.columns]
col2_max col2_min col2_std col3_size col3_std col3_mean col3_max
col1
1 5 1 1.581139 5 1.581139 -3 -1
2 9 0 3.535534 5 3.535534 -6 0
对于像这样的操作groupby().summarize(newcolumn=max(col2 * col3))
,您仍然可以通过首先添加一个新列来使用 agg assign
。
df.assign(new_col=df.eval('col2 * col3')).groupby('col1').agg('max')
col2 col3 new_col
col1
1 5 -1 -1
2 9 0 0
这将返回旧列和新列的最大值,但您可以像往常一样对其进行切片。
df.assign(new_col=df.eval('col2 * col3')).groupby('col1')['new_col'].agg('max')
col1
1 -1
2 0
Name: new_col, dtype: int64
这样groupby.apply
会更短:
df.groupby('col1').apply(lambda x: (x.col2 * x.col3).max())
col1
1 -1
2 0
dtype: int64
但是,groupby.apply
将其视为自定义函数,因此未进行矢量化。到目前为止,我们传递给agg
('min', 'max', 'min', 'size' 等) 的函数是矢量化的,这些是这些优化函数的别名。您可以df.groupby('col1').agg('min')
用df.groupby('col1').agg(min)
,df.groupby('col1').agg(np.min)
或替换df.groupby('col1').min()
它们,它们都将执行相同的功能。当您使用自定义函数时,您不会看到同样的效率。
最后,从 0.20 版开始,agg
可以直接在 DataFrames 上使用,而无需先分组。请参阅此处的示例。