在python中使用pandas和numpy进行聚合时向函数传递参数



我有以下代码和数据框架:

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

我想使用np.quantile计算列'A'的0.25百分位数和列'B'的0.75百分位数。我尝试下面的代码:

(df.
agg({'A' : lambda x: np.quantile(a=x, q=0.25),
'B' : lambda x: np.quantile(a=x, q=0.75)}))

我得到以下结果:

A     B
0  1.0   6.0
1  2.0   7.0
2  3.0   8.0
3  4.0   9.0
4  5.0  10.0

然而,我期待下面的结果或类似的东西:

A    2.0
B    9.0
dtype: float64

问题是lambda函数计算的是序列中每个元素的分位数,而不是整个序列的分位数。

我的问题是,如果我想使用pandas的agg函数和numpy的分位数函数,如果我想使用lambda函数传递不同的参数给函数,我如何获得预期的结果。

我已经读了Python Pandas:传递多个函数到agg()带参数和指定参数到Pandas聚合函数,但它们只在数据分组时工作,而不是在数据未分组时工作。

您错过了axis参数:

>>> df.agg({'A' : lambda x: np.quantile(a=x, q=0.25, axis=0),
'B' : lambda x: np.quantile(a=x, q=0.75, axis=0)})
A    2.0
B    9.0
dtype: float64

您也可以使用partial函数:

from functools import partial
q25 = partial(np.quantile, q=0.25, axis=0)
q75 = partial(np.quantile, q=0.75, axis=0)
df.agg({'A': q25, 'B': q75})

Series.quantile:

df.agg({'A': lambda s: s.quantile(0.25),
'B': lambda s: s.quantile(0.75)})

对于numpy.quantile,您需要传递numpy数组,而不是Series:

df.agg({'A' : lambda x: np.quantile(a=x.values, q=0.25),
'B' : lambda x: np.quantile(a=x.values, q=0.75)})

输出:

A    2.0
B    9.0
dtype: float64

最新更新