Pandas groupby分位数值

时间:2017-12-04 16:27:55

标签: python pandas

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

当试图运行最后2行时,我收到错误“AttributeError:'SeriesGroupBy'对象没有属性'quantile(0.25)'”。我该如何解决这个问题?

import pandas as pd
raw_data = {'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]}
df = pd.DataFrame(raw_data)
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)

3 个答案:

答案 0 :(得分:7)

我更喜欢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

答案 1 :(得分:3)

@WeNYoBen的答案很好。但是,存在一个局限性,那就是需要为每个分位数创建一个新函数。如果分位数变大,这可能是一个非常棘手的练习。更好的方法是使用一个函数来创建一个函数,并适当地重命名该函数。

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

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

答案 2 :(得分:0)

如果您想为聚合列命名,有一个不错的方法:

df1.groupby('x').agg(
    q1_foo=pd.NamedAgg('number', q1),
    q2_foo=pd.NamedAgg('number', q2)
)