为数据框中的每个组找到不同的百分位数
Find different percentile for every group in data frame
我的日期框结构如下:
df = pd.DataFrame({'GROUP_ID': np.random.randint(1, 7, size=100),
'VALUES': np.random.randint(0, 50, size=100)})
df['THRESHOLD'] = df['GROUP_ID']*5
df = df[['GROUP_ID','VALUES','THRESHOLD']]
df.sort_values(by='GROUP_ID', inplace=True)
(这个只是举例)
THRESHOLD 列实际上是每个组的百分位数(以 % 为单位)。
我需要添加一列 'PERCENTILE',其中应该有每组值的百分位数数值。
我试图使用 groupby
和 apply
,但我不知道如何将 THRESHOLD 列的值传递给 quantile\percentile
函数中的参数 q
。
为 GROUP_ID
传递给函数 transform
for new column with quantile
使用 x.name
创建字典和映射阈值,只需要介于 0 和 1 之间的阈值:
np.random.seed(152)
df = pd.DataFrame({'GROUP_ID': np.random.randint(1, 7, size=100),
'VALUES': np.random.randint(0, 50, size=100)})
df['THRESHOLD'] = df['GROUP_ID'] / 15
df = df[['GROUP_ID','VALUES','THRESHOLD']]
df.sort_values(by='GROUP_ID', inplace=True)
d = dict(zip(df['GROUP_ID'], df['THRESHOLD']))
df['new'] = df.groupby('GROUP_ID')['VALUES'].transform(lambda x: x.quantile(d[x.name]))
print (df.head(20))
GROUP_ID VALUES THRESHOLD new
23 1 17 0.066667 7.733333
53 1 9 0.066667 7.733333
39 1 43 0.066667 7.733333
57 1 15 0.066667 7.733333
36 1 47 0.066667 7.733333
59 1 17 0.066667 7.733333
28 1 4 0.066667 7.733333
63 1 33 0.066667 7.733333
18 1 12 0.066667 7.733333
12 1 27 0.066667 7.733333
47 1 43 0.066667 7.733333
81 1 45 0.066667 7.733333
91 1 45 0.066667 7.733333
5 1 8 0.066667 7.733333
83 1 26 0.066667 7.733333
61 2 39 0.133333 4.200000
95 2 33 0.133333 4.200000
44 2 22 0.133333 4.200000
42 2 34 0.133333 4.200000
41 2 48 0.133333 4.200000
我的日期框结构如下:
df = pd.DataFrame({'GROUP_ID': np.random.randint(1, 7, size=100),
'VALUES': np.random.randint(0, 50, size=100)})
df['THRESHOLD'] = df['GROUP_ID']*5
df = df[['GROUP_ID','VALUES','THRESHOLD']]
df.sort_values(by='GROUP_ID', inplace=True)
(这个只是举例)
THRESHOLD 列实际上是每个组的百分位数(以 % 为单位)。 我需要添加一列 'PERCENTILE',其中应该有每组值的百分位数数值。
我试图使用 groupby
和 apply
,但我不知道如何将 THRESHOLD 列的值传递给 quantile\percentile
函数中的参数 q
。
为 GROUP_ID
传递给函数 transform
for new column with quantile
使用 x.name
创建字典和映射阈值,只需要介于 0 和 1 之间的阈值:
np.random.seed(152)
df = pd.DataFrame({'GROUP_ID': np.random.randint(1, 7, size=100),
'VALUES': np.random.randint(0, 50, size=100)})
df['THRESHOLD'] = df['GROUP_ID'] / 15
df = df[['GROUP_ID','VALUES','THRESHOLD']]
df.sort_values(by='GROUP_ID', inplace=True)
d = dict(zip(df['GROUP_ID'], df['THRESHOLD']))
df['new'] = df.groupby('GROUP_ID')['VALUES'].transform(lambda x: x.quantile(d[x.name]))
print (df.head(20))
GROUP_ID VALUES THRESHOLD new
23 1 17 0.066667 7.733333
53 1 9 0.066667 7.733333
39 1 43 0.066667 7.733333
57 1 15 0.066667 7.733333
36 1 47 0.066667 7.733333
59 1 17 0.066667 7.733333
28 1 4 0.066667 7.733333
63 1 33 0.066667 7.733333
18 1 12 0.066667 7.733333
12 1 27 0.066667 7.733333
47 1 43 0.066667 7.733333
81 1 45 0.066667 7.733333
91 1 45 0.066667 7.733333
5 1 8 0.066667 7.733333
83 1 26 0.066667 7.733333
61 2 39 0.133333 4.200000
95 2 33 0.133333 4.200000
44 2 22 0.133333 4.200000
42 2 34 0.133333 4.200000
41 2 48 0.133333 4.200000