微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获取每组可变分位数的值

如何解决获取每组可变分位数的值

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

因此,鉴于这样的数据:

Data

我希望对象1、2和5获得结果1,而其他3个结果为0。我的数据总共由7.0万行和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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。