首页 > 解决方案 > Python Pandas:有效地聚合不同列上的不同函数并将结果列组合在一起

问题描述

到目前为止,我对标题中描述的任务的方法非常简单,但它似乎有点低效/unpythonic。我通常做的一个例子如下:


原始的 Pandas DataFramedf有 6 列:'open', 'high', 'low', 'close', 'volume', 'new dt'

import pandas as pd

df_gb = df.groupby('new dt')

arr_high = df_gb['high'].max()
arr_low = df_gb['low'].min()
arr_open = df_gb['open'].first()
arr_close = df_gb['close'].last()
arr_volumne = df_gb['volume'].sum()

df2 = pd.concat([arr_open,
                 arr_high,
                 arr_low,
                 arr_close,
                 arr_volumne], axis = 'columns')

乍一看似乎已经很高效,但是当我有 20 个函数等待应用到 20 个不同的列时,它很快就变得不合 Python/低效。

有没有办法让它更高效/pythonic?先感谢您

标签: pythonpandasperformanceaggregatepandas-groupby

解决方案


In [3]: import pandas as pd                                                     
In [4]: import numpy as np                                                      
In [5]: df = pd.DataFrame([[1, 2, 3],[4, 5, 6],[7, 8, 9], 
...: [np.nan, np.nan, np.nan]],columns=['A', 'B', 'C']) 

In [6]: df.agg({'A' : ['sum', 'min'], 'B' : ['min', 'max']})                    
Out[6]: 
        A    B
max   NaN  8.0
min   1.0  2.0
sum  12.0  NaN

对于作为列的函数:

In [11]: df.agg({'A' : ['sum'], 'B' : ['min', 'max']}).T                        
Out[11]: 
   max  min   sum
A  NaN  NaN  12.0
B  8.0  2.0   NaN

要使用自定义函数,您可以这样做:

In [12]: df.agg({'A' : ['sum',lambda x:x.mean()], 'B' : ['min', 'max']}).T      
Out[12]: 
   <lambda>  max  min   sum
A       4.0  NaN  NaN  12.0
B       NaN  8.0  2.0   NaN

推荐阅读