熊猫在其中获得价值百分位
Posted
技术标签:
【中文标题】熊猫在其中获得价值百分位【英文标题】:pandas get percentile of value withing 【发布时间】:2021-03-12 03:54:51 【问题描述】:我有一个数据框:
d = [f1 f2 f3
1 2 3
5 1 2
3 3 1
2 4 7
.. .. ..]
我想为每个特征添加行中该特征值的百分位数(对于特征子集)。
所以对于subset = [f1,f2,f3]
,我的数据框将是
new_d =[f1 f2 f3 f1_per f2_per f3_per
1 2 3 0 0.25 0.5
5 1 2 1 0 0.25
3 3 1 0.5 0.5 0
2 4 5 0.25 0.75 1
4 5 4 0.75 1 0.75]
最好的方法是什么?
【问题讨论】:
是否可以解释这里的百分位数如何?百分位函数中的q
是什么? DataFrame.quantile
?
@jezrael 是的,意思是这个特征的值有多少百分比小于特定行的值
@jezrael 抱歉,我不确定我是否理解?对于每个数字,我想知道较小的数字的比率是多少。所以,如果轴是 [1,2,3,4,5] 那么数字 4 是 0.75,因为其他数字的 3/4 比他小。
是的,我不确定,因为输入数据是 4 行,输出是 5 行。所以输出与您的数据不同(如果了解需要什么。)
【参考方案1】:
一种方法如下:
df['pct_1'] = df.f1.rank(pct=True)
df['pct_f2'] = df.f2.rank(pct=True)
df['pct_f3'] = df.f3.rank(pct=True)
给出:
f1 f2 f3 pct_1 pct_f2 pct_f3
0 1 2 3 0.25 0.50 0.75
1 5 1 2 1.00 0.25 0.50
2 3 3 1 0.75 0.75 0.25
3 2 4 7 0.50 1.00 1.00
【讨论】:
【参考方案2】:输出是 5 行,输入是 4 行,所以输出不同是使用 DataFrame.rank
与所有列并连接回原始
df = df.join(df.rank(pct=True).add_prefix('pct'))
print (df)
f1 f2 f3 pctf1 pctf2 pctf3
0 1 2 3 0.2 0.4 0.6
1 5 1 2 1.0 0.2 0.4
2 3 3 1 0.6 0.6 0.2
3 2 4 7 0.4 0.8 1.0
4 4 5 4 0.8 1.0 0.8
如果需要按不带1
的行数按百分位数排名:
df = df.join(df.rank().sub(1).div(len(df) - 1).add_prefix('pct'))
print (df)
f1 f2 f3 pctf1 pctf2 pctf3
0 1 2 3 0.00 0.25 0.50
1 5 1 2 1.00 0.00 0.25
2 3 3 1 0.50 0.50 0.00
3 2 4 7 0.25 0.75 1.00
4 4 5 4 0.75 1.00 0.75
【讨论】:
【参考方案3】:这是另一种方法,明确地做你想做的事:
res = df.apply(lambda x: np.greater.outer(x.values, x.values).sum(axis=1) / (len(x) - 1))
res.columns = [f'c_per' for c in df.columns]
res = df.join(res)
print(res)
输出
f1 f2 f3 f1_per f2_per f3_per
0 1 2 3 0.00 0.25 0.50
1 5 1 2 1.00 0.00 0.25
2 3 3 1 0.50 0.50 0.00
3 2 4 7 0.25 0.75 1.00
4 4 5 4 0.75 1.00 0.75
【讨论】:
以上是关于熊猫在其中获得价值百分位的主要内容,如果未能解决你的问题,请参考以下文章