熊猫在其中获得价值百分位

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

【讨论】:

以上是关于熊猫在其中获得价值百分位的主要内容,如果未能解决你的问题,请参考以下文章

盼盼熊猫小型张的投资价值

如何获得熊猫数据框中一行的百分位数?

一旦我从 Promise 中获得价值,就渲染 li 价值

如何获得 CKEditor 5 的价值?

滚动百分位数 - 熊猫

我无法获得我在 Tkinter 中的条目的价值 | Python