您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

dplyr通过多种功能汇总/汇总的熊猫等效于什么?

dplyr通过多种功能汇总/汇总的熊猫等效于什么?

相当于

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,其索引名为col1,列名为col2col3认情况下,对数据熊猫进行分组时,会将分组列设置为索引,以进行有效的访问和修改。但是,如果您不希望这样做,可以使用两种方法将其设置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

但是,不建议使用改名方法

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)),您仍然可以通过先用添加新列来使用aggassign

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上使用,而不必先进行分组。

其他 2022/1/1 18:29:34 有366人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶