首页 > 解决方案 > 熊猫:如何将组的总和添加到组的最大值

问题描述

我在 pandas 上有三列dfid, 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

在此处输入图像描述

标签: pythonpandasdataframesummax

解决方案


尝试这个 -

  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

替代方法

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

推荐阅读