Pandas 仅对ID重复的行执行加权比率

Pandas 仅对ID重复的行执行加权比率,pandas,numpy,Pandas,Numpy,假设我有以下情况: 第一列['ID']最终将具有重复值的数据帧 import pandas as pd df = pd.DataFrame({"ID": [1,2,3,4,4,5,5,5,6,6], "l_1": [1,1,1,1,2,1,1,3,2,1], "l_2": [10,12,32,45,0,20,0,0,20,0],

假设我有以下情况:

第一列
['ID']
最终将具有重复值的数据帧

import pandas as pd
df = pd.DataFrame({"ID": [1,2,3,4,4,5,5,5,6,6], 
                  "l_1": [1,1,1,1,2,1,1,3,2,1], 
                  "l_2": [10,12,32,45,0,20,0,0,20,0],
                  "l_3": [5,12,32,33,0,10,0,0,5,0]})


ID  l_1 l_2 l_3
1   1   10  5
2   1   12  12
3   1   32  32
4   1   45  33
4   2   0   0
5   1   20  10
5   1   0   0
5   3   0   0
6   2   20  5
6   1   0   0
我正在努力做到以下几点:

1-仅选择具有重复ID的行

2-将l_2和l_3行分别替换为:

  • (l_2之和(按ID分组)除以l_1之和(按ID分组))*l_1
  • (l_3之和(按ID分组)除以l_1之和(按ID分组))*l_1
3-将这些重复的ID行合并回初始数据帧

预期产出:

ID  l_1     l_2      l_3
1   1   10.000000   5.000000
2   1   12.000000   12.000000
3   1   32.000000   32.000000
4   1   15.000000   11.000000
4   2   30.000000   22.000000
5   1   4.000000    2.000000
5   1   4.000000    2.000000
5   3   12.000000   6.000000
6   2   13.333333   3.333333
6   1   6.666667    1.666667
有没有一种简单的方法可以使用熊猫或numpy来实现这一点

我可以通过以下步骤来完成:

df1 = df[df.duplicated(subset=['ID'], keep=False)].groupby('ID')[['l_1', 'l_2', 'l_3']].sum().reset_index()
df1['ratio_1'] = df1['l_2'] / df1['l_1']
df1['ratio_2'] = df1['l_3'] / df1['l_1']
df = df.merge(df1[['ID','ratio_1', 'ratio_2']], on=['ID'], how='left')
df['l_2'] = np.where(df['ratio_1'].isnull(), df['l_2'], df['ratio_1']*df['l_1'])
df['l_3'] = np.where(df['ratio_2'].isnull(), df['l_3'], df['ratio_2']*df['l_1'])
df.drop(columns=['ratio_1', 'ratio_2'], inplace=True)
让我们试试:

s = df.groupby('ID').transform('sum')

s.div(s['l_1'], axis='rows').mul(df['l_1'], axis='rows')
输出:

   l_1        l_2        l_3
0  1.0  10.000000   5.000000
1  1.0  12.000000  12.000000
2  1.0  32.000000  32.000000
3  1.0  15.000000  11.000000
4  2.0  30.000000  22.000000
5  1.0   4.000000   2.000000
6  1.0   4.000000   2.000000
7  3.0  12.000000   6.000000
8  2.0  13.333333   3.333333
9  1.0   6.666667   1.666667

非常感谢您@Quang Hoang。我真的很喜欢你的方法。