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
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。我真的很喜欢你的方法。