Pandas groupby 分位数值

新手上路,请多包涵

我尝试从数据框中计算特定的分位数值,如下面的代码所示。分行计算没有问题。

尝试运行最后两行时,出现以下错误:

 AttributeError: 'SeriesGroupBy' object has no attribute 'quantile(0.25)'

我怎样才能解决这个问题?

 import pandas as pd
df = pd.DataFrame(
    {
        'x': [0, 1, 0, 1, 0, 1, 0, 1],
        'y': [7, 6, 5, 4, 3, 2, 1, 0],
        'number': [25000, 35000, 45000, 50000, 60000, 70000, 65000, 36000]
    }
)
f = {'number': ['median', 'std', 'quantile']}
df1 = df.groupby('x').agg(f)
df.groupby('x').quantile(0.25)
df.groupby('x').quantile(0.75)

# code below with problem:
f = {'number': ['median', 'std', 'quantile(0.25)', 'quantile(0.75)']}
df1 = df.groupby('x').agg(f)

原文由 lignin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

我更喜欢 def 函数

def q1(x):
    return x.quantile(0.25)

def q3(x):
    return x.quantile(0.75)

f = {'number': ['median', 'std', q1, q3]}
df1 = df.groupby('x').agg(f)
df1
Out[1643]:
  number
  median           std     q1     q3
x
0  52500  17969.882211  40000  61250
1  43000  16337.584481  35750  55000

原文由 BENY 发布,翻译遵循 CC BY-SA 4.0 许可协议

@WeNYoBen 的回答很棒。但是有一个限制,那就是需要为每个分位数创建一个新函数这一事实。如果分位数的数量变大,这可能是一个非常不符合 python 的练习。更好的方法是使用一个函数来创建一个函数,并适当地重命名该函数。

 def rename(newname):
    def decorator(f):
        f.__name__ = newname
        return f
    return decorator

def q_at(y):
    @rename(f'q{y:0.2f}')
    def q(x):
        return x.quantile(y)
    return q

f = {'number': ['median', 'std', q_at(0.25) ,q_at(0.75)]}
df1 = df.groupby('x').agg(f)
df1

Out[]:
number
  median           std  q0.25  q0.75
x
0  52500  17969.882211  40000  61250
1  43000  16337.584481  35750  55000

rename 装饰器重命名函数,以便 pandas agg 函数可以处理返回的分位数函数的重用(否则所有分位数结果最终都在名为 q 的列中)。

原文由 Jurgen Strydom 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题