将数据框列填入单独的百分位数

Fill in dataframe column into separate percentiles

我有一个看起来像这样的大数据框:

ID   Fruit       Percentiles
001  Apple          0
002  Pear           0
003  Banana         0
004  Kiwi           0
005  Orange         0
006  Pineapple      0
...
...
039  Peach          0
040  Grapes         0

我想创建 40 个不同的百分位数(数据框已经排序,所以我只需要一种方法来填充“百分位数”列)

最终的 Dataframe 应该是这样的:

ID   Fruit       Percentile
001  Apple          1
002  Pear           1
003  Banana         2
004  Kiwi           2
005  Orange         3
006  Pineapple      3
...
...
039  Peach          40
040  Grapes         40

我试图创建一个循环来做这样的事情:

df.Category[0:int(df.size[0]*0.05)] = 1
df.Category[int(df.size[0]*0.05):int(df.size[0]*0.10)+1] = 2
...
...
df.Category[int(df.size[0]*0.95):int(df.size[0])+1] = 20

pd.cut 可用于 RangeIndex 以分组为均匀大小的组:

df['Percentile'] = pd.cut(df.index, bins=20, labels=False) + 1

如果index is not already the default ascending zero based range index, we can use pd.RangeIndex根据DataFrame的长度生成一个代替:

df['Percentile'] = pd.cut(pd.RangeIndex(len(df)), bins=20, labels=False) + 1

np.arange 的工作原理类似:

df['Percentile'] = pd.cut(np.arange(len(df)), bins=20, labels=False) + 1

一些示例数据:

import numpy as np
import pandas as pd

n = 40
df = pd.DataFrame({
    'ID': [f'{i:03d}' for i in range(1, n + 1)],
    'Fruit': np.random.choice(['Apple', 'Pear', 'Banana', 'Kiwi', 'Orange'], n)
})