我尝试从数据帧计算特定的分位数值,如下面的代码所示。在单独的行中计算时没有问题。
当试图运行最后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)
答案 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)
)