Pandas如何将多个函数应用于数据帧

dev*_*an0 18 python pandas

有没有办法将函数列表应用于DataFrame中的每一列,如DataFrameGroupBy.agg函数呢?我找到了一种丑陋的方式来做到这一点:

df=pd.DataFrame(dict(one=np.random.uniform(0,10,100), two=np.random.uniform(0,10,100)))
df.groupby(np.ones(len(df))).agg(['mean','std'])

        one                 two
       mean       std      mean       std
1  4.802849  2.729528  5.487576  2.890371
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 21

对于Pandas 0.20.0或更新版本,请使用df.agg(感谢ayhan 指出这一点):

In [11]: df.agg(['mean', 'std'])
Out[11]: 
           one       two
mean  5.147471  4.964100
std   2.971106  2.753578
Run Code Online (Sandbox Code Playgroud)

对于旧版本,您可以使用

In [61]: df.groupby(lambda idx: 0).agg(['mean','std'])
Out[61]: 
        one               two          
       mean       std    mean       std
0  5.147471  2.971106  4.9641  2.753578
Run Code Online (Sandbox Code Playgroud)

另一种方式是:

In [68]: pd.DataFrame({col: [getattr(df[col], func)() for func in ('mean', 'std')] for col in df}, index=('mean', 'std'))
Out[68]: 
           one       two
mean  5.147471  4.964100
std   2.971106  2.753578
Run Code Online (Sandbox Code Playgroud)

  • `agg`现在可用作DataFrame方法,所以这也没有诀窍:`df.agg(['mean','std'])`. (2认同)

Doc*_*r J 10

在具有任意函数和列名称的一般情况下,您可以这样做:

df.apply(lambda r: pd.Series({'mean': r.mean(), 'std': r.std()})).transpose()

         mean       std
one  5.366303  2.612738
two  4.858691  2.986567
Run Code Online (Sandbox Code Playgroud)