python - 熊猫:如何将组的总和添加到组的最大值
问题描述
我在 pandas 上有三列df
:id, hazard, probability
我想确保每个 id,危险组合的概率总和为 1。
所以我想找到每个id的概率总和,危险。
并且还找到每个 id、危险的最大概率的索引,并将 1-sum 添加到该值。
我在堆栈溢出中找到了如何分别执行这两个操作,但找不到将它们组合起来的方法。
查找每组最大值的索引:
i = df.groupby(['id','haz'])['prob'].transform('idxmax').values
求每组的概率总和:
sums= df.groupby(['id','haz'])['prob'].sum()
如何将这两者结合起来以确保每组的概率之和正好为 1?
到目前为止我的代码和下面的示例 df
import pandas as pd
import numpy as np
File = 'testprob1.csv'
VF = pd.read_csv(f'{File}', sep=',', header=0, index_col=False, dtype='str')
VF = VF.astype({'id': 'str', 'haz': 'int16', 'prob': 'float64'})
i = VF.groupby(['id','haz'])['prob'].transform('idxmax').values
sums= VF.groupby(['id','haz'])['prob'].sum()
编辑:示例 df
解决方案
尝试这个 -
new_proba
计算他们需要替换其最大值的每个组的新概率值。- 然后,您可以使用
idxmax
查找行索引并df.loc
查找这些行并使用new_proba
new_proba = df.groupby(['id','haz'])['prob'].apply(lambda x: max(x)+1-(sum(x))).values
df.loc[df.groupby(['id','haz'])['prob'].agg('idxmax').values, 'prob'] = new_proba
print(df)
id haz prob
0 1 20 0.05
1 1 20 0.05
2 1 20 0.90
3 1 30 0.98
4 1 30 0.02
5 2 30 1.00
6 2 40 0.12
7 2 40 0.78
8 2 40 0.05
9 2 40 0.05
替代方法
对于您的自定义重新缩放功能,您可以编写自己的功能并将其应用于每个组。然后以列表的形式返回新的概率,一旦传入 apd.Series
就会像使用.transform
.
idd = [1,1,1,1,1,2,2,2,2,2]
haz = [20,20,20,30,30,30,40,40,40,40]
prob = [0.05,0.05,0.42,0.3,0.02,0.05,0.12,0.44,0.05,0.05]
df = pd.DataFrame({'id':idd, 'haz':haz, 'prob':prob})
def f(l):
return [i+(1-sum(l)) if i==max(l) else i for i in l]
df['new_proba'] = df.groupby(['id','haz'])['prob'].apply(lambda x: pd.Series(f(x))).values
print(df)
id haz prob new_proba
0 1 20 0.05 0.05
1 1 20 0.05 0.05
2 1 20 0.42 0.90
3 1 30 0.30 0.98
4 1 30 0.02 0.02
5 2 30 0.05 1.00
6 2 40 0.12 0.12
7 2 40 0.44 0.78
8 2 40 0.05 0.05
9 2 40 0.05 0.05
只是为了确认每组的总和是 1 -
df.groupby(['id','haz'])['new_proba'].sum()
id haz
1 20 1.0
30 1.0
2 30 1.0
40 1.0
Name: new_proba, dtype: float64
推荐阅读
- gnuplot - Gnuplot 根据 Matrix 数据在极坐标中绘制 2D 热图
- latex - Latex 中数学方程的目录
- c# - C# 上的 System.Data 表数据类型修复
- webpack - 无效的选项对象。Image Minimizer Plugin 已使用与 API 架构不匹配的选项对象进行初始化
- python - 为数据帧的每一行获取字符串的第一部分
- docker - 如何使用 ansible 从不安全的 docker 注册表中提取?
- tableau-api - Tableau 作业的事件管理
- angular - 如果用户通过(shift + tab)聚焦在场外,如何防止调用聚焦方法
- python-3.x - TypeError:不可散列的类型:django中的'slice'
- python - 对象碰撞适用于右运动,但不适用于左运动