Pandas groupby分位数值

lig*_*nin 10 python pandas

我试图从数据帧计算特定的分位数值,如下面的代码所示.在单独的行中计算它没有问题.

当试图运行最后2行时,我收到错误"AttributeError:'SeriesGroupBy'对象没有属性'分位数(0.25)'".我怎样才能解决这个问题?

AttributeError: 'SeriesGroupBy' object has no attribute 'quantile(0.25)'
Run Code Online (Sandbox Code Playgroud)

WeN*_*Ben 19

我更喜欢def功能

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

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

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


Jur*_*dom 9

@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
Run Code Online (Sandbox Code Playgroud)

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