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

e3bfsja2  于 2023-04-06  发布在  Python
关注(0)|答案(2)|浏览(162)

我有以下代码和 Dataframe :

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: Passing Multiple Functions to agg() with ArgumentsSpecifying arguments to pandas aggregate function的文章,但它们只在数据分组时起作用,而在数据未分组时不起作用。

xxhby3vn

xxhby3vn1#

您错过了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})
c9x0cxw0

c9x0cxw02#

这在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

相关问题