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

时间:2014-03-02 13:32:44

标签: 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

4 个答案:

答案 0 :(得分:21)

对于Pandas 0.20.0或更高版本,请使用df.agg(感谢ayhan代表pointing this out):

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

对于旧版本,您可以使用

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

另一种方式是:

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

答案 1 :(得分:9)

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

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

答案 2 :(得分:2)

我试图将三个函数应用到一列中并且有效

#removing new line character
rem_newline = lambda x : re.sub('\n',' ',x).strip()

#character lower and removing spaces
lower_strip = lambda x : x.lower().strip()

df = df['users_name'].apply(lower_strip).apply(rem_newline).str.split('(',n=1,expand=True)

答案 3 :(得分:0)

我正在使用熊猫来分析智利的立法草案。在我的数据框中,作者列表存储为字符串。上面的答案对我不起作用(使用pandas 0.20.3)。所以我使用了自己的逻辑并想出了这个:

df.authors.apply(eval).apply(len).sum()

连接适用!管道!!第一个应用变换

"['Barros Montero: Ramón', 'Bellolio Avaria: Jaime', 'Gahona Salazar: Sergio']"

进入明显的清单,第二个申请计算参与该项目的立法者人数。我想要每一对的大小(立法者,项目编号)(所以我可以预设一个数组,我将研究哪些政党在做什么)。

有趣的是,这有效!更有趣的是,如果一个人过于雄心勃勃而最后一次调用就会失败,而是这样做:

df.autores.apply(eval).apply(len).apply(sum)

有错误:

TypeError: 'int' object is not iterable

来自/site-packages/pandas/core/series.py深入了解