Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将多个函数应用于数据帧_Python_Pandas - Fatal编程技术网

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

Python 如何将多个函数应用于数据帧,python,pandas,Python,Pandas,是否有一种方法可以像DataFrameGroupBy.agg函数那样将函数列表应用于DataFrame中的每一列?我找到了一个丑陋的方法来这样做: 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

是否有一种方法可以像DataFrameGroupBy.agg函数那样将函数列表应用于DataFrame中的每一列?我找到了一个丑陋的方法来这样做:

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

对于熊猫0.20.0或更新版本,请使用(感谢ayhan):

对于旧版本,您可以使用

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

在具有任意函数和列名的一般情况下,可以执行以下操作:

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

我用熊猫来分析智利的立法草案。在我的dataframe中,作者列表存储为字符串。上面的答案对我不适用(使用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

来自apply中的/site-packages/pandas/core/series.py,我尝试将三个函数应用到一个列中,结果很好

#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)

agg
现在可以作为一种数据帧方法使用,因此这也不需要技巧:
df.agg(['mean','std'])
@ayhan:非常感谢改进。我注意到使用agg比在df中应用函数慢得多。i、 e df.sum(),df。mean()而不是df.agg(['sum'],'mean'])。“这是有原因的还是我做错了什么?”赛亚斯:这也许值得作为一个新问题来问。我的猜测是,
df.agg(['sum','mean'])
最终会调用它来处理许多不同的输入和输出情况。所有这些额外的案例处理都会降低
df.agg
的性能。在这种情况下,您可以通过使用类似于
pd.DataFrame({'sum':df.sum(),'mean':df.mean()}).T的内容自己构建所需的数据帧来绕过许多代码。
#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)