首页 > 解决方案 > 获取每组变量分位数的值

问题描述

我有按组分类的数据,每组具有给定的分位数百分比。我想为每个组创建一个阈值,该阈值根据分位数百分比分隔组内的所有值。因此,如果一组 q=0.8,我希望最低 80% 的值给定 1,而最高 20% 的值给定 0。

所以,给定这样的数据:

数据

我希望对象 1、2 和 5 获得结果 1,其他 3 个结果为 0。我的数据总共包含 7.000.000 行和 14.000 个组。我尝试使用 groupby.quantile 执行此操作,但因此我需要一个恒定的分位数度量,而我的数据对每个组都有不同的度量。

标签: pandasquantile

解决方案


设置:

num = 7_000_000
grp_num = 14_000
qua = np.around(np.random.uniform(size=grp_num), 2)
df = pd.DataFrame({
    "Group": np.random.randint(low=0, high=grp_num, size=num),
    "Quantile": 0.0,
    "Value": np.random.randint(low=100, high=300, size=num)
}).sort_values("Group").reset_index(0, drop=True)

def func(grp):
    grp["Quantile"] = qua[grp.Group]
    return grp

df = df.groupby("Group").apply(func)

答:(这基本上是一个 for 循环,因此为了性能,您可以尝试将numba应用于此)

def func2(grp):
    return grp.Value < grp.Value.quantile(grp.Quantile.iloc[0])

df["result"] = df.groupby("Group").apply(func2).reset_index(0, drop=True)
print(df)

输出:

         Group  Quantile  Value  result
0            0      0.33    156       1
1            0      0.33    259       0
2            0      0.33    166       1
3            0      0.33    183       0
4            0      0.33    111       1
...        ...       ...    ...     ...
6999995  13999      0.83    194       1
6999996  13999      0.83    227       1
6999997  13999      0.83    215       1
6999998  13999      0.83    103       1
6999999  13999      0.83    115       1

[7000000 rows x 4 columns]
CPU times: user 14.2 s, sys: 362 ms, total: 14.6 s
Wall time: 14.7 s

推荐阅读