我有以下数据框
item_id group price
0 1 A 10
1 3 A 30
2 4 A 40
3 6 A 60
4 2 B 20
5 5 B 50
我希望根据各组的价格添加一个分位数列,如下所示:
item_id group price quantile
01 A 10 0.25
03 A 30 0.5
04 A 40 0.75
06 A 60 1.0
02 B 20 0.5
05 B 50 1.0
我可以遍历整个数据帧并为每个组执行计算。但是,我想知道是否有更优雅的方法来解决此问题?谢谢!
答案 0 :(得分:7)
您需要df.rank()
和pct=True
:
pct:bool,默认为False 是否以百分比形式显示返回的排名。
df['quantile']=df.groupby('group')['price'].rank(pct=True)
print(df)
item_id group price quantile
0 1 A 10 0.25
1 3 A 30 0.50
2 4 A 40 0.75
3 6 A 60 1.00
4 2 B 20 0.50
5 5 B 50 1.00
答案 1 :(得分:1)
尽管上面的df.rank
方法可能是解决此问题的方法。这是将pd.qcut
与GroupBy
结合使用的另一种解决方案:
df['quantile'] = (
df.groupby('group')['price']
.apply(lambda x: pd.qcut(x, q=len(x), labels=False)
.add(1)
.div(len(x))
)
)
item_id group price quantile
0 1 A 10 0.25
1 3 A 30 0.50
2 4 A 40 0.75
3 6 A 60 1.00
4 2 B 20 0.50
5 5 B 50 1.00