Pandas:如何将组的总和添加到组的最大值

2024-04-28 21:14:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有三列关于熊猫的dfid, hazard, probability

我想确定每个id的概率之和,危险组合是1

所以我想找出每个id的概率之和hazard

还可以找到每个id、危害的最大概率指数,并将该值加上1-和

我在stack overflow中找到了如何分别处理这两个问题,但找不到将它们结合起来的方法

查找每组最大值的索引:

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

enter image description here


Tags: importid示例dftransform概率hazardvalues
1条回答
网友
1楼 · 发布于 2024-04-28 21:14:57

试试这个-

  1. new_proba计算每个组需要替换其最大值的新概率值
  2. 然后,您可以使用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

替代方法

对于自定义重缩放函数,您可以编写自己的函数并将其应用于每个组。然后以列表的形式返回新的概率,一旦传递到pd.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

相关问题 更多 >