我有以下代码和数据框架:
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