pandas - 获取每组变量分位数的值
问题描述
我有按组分类的数据,每组具有给定的分位数百分比。我想为每个组创建一个阈值,该阈值根据分位数百分比分隔组内的所有值。因此,如果一组 q=0.8,我希望最低 80% 的值给定 1,而最高 20% 的值给定 0。
所以,给定这样的数据:
我希望对象 1、2 和 5 获得结果 1,其他 3 个结果为 0。我的数据总共包含 7.000.000 行和 14.000 个组。我尝试使用 groupby.quantile 执行此操作,但因此我需要一个恒定的分位数度量,而我的数据对每个组都有不同的度量。
解决方案
设置:
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
推荐阅读
- docker - Docker daemon memory consumption grows over time
- google-cloud-firestore - 允许未注册用户查询 Firestore 以检查电子邮件是否已存在
- stanford-nlp - Warnings on Spanish text processing Stanford CoreNLP Number in types > column for ... is probably priority
- java - Address already in use in spring boot, can we tell spring to reuse the same address?
- javascript - vuejs在输入时为数字添加逗号
- excel - 禁用对机密选项卡的访问
- java - 如何在 java 中将我的答案四舍五入到小数点后三位,以便 10.5 应打印为 105.000
- vba - 如何在 ms Access 中使用组合框显示表中字段的值,同时向用户提供要编辑的选项列表?
- ruby-on-rails - 在视图中加载记录后如何更新记录的属性?
- python - 从扫描的 PDF 中提取文本而不将扫描保存为新的文件图像