我有一個這樣的資料框:
Group Col A Col B
1 A1 B1
1 A2 B2
2 A3 B3
2 A4 B4
我想創建一個新列 Per A 和 Per B 尊重組,所以結果應該是
Group Col A Col B Per A Per B
1 A1 B1 100*A1/(A1 A2) 100*B1/(B1 B2)
1 A2 B2 100*A2/(A1 A2) 100*B2/(B1 B2)
2 A3 B3 100*A3/(A3 A4) 100*B3/(B3 B4)
2 A4 B4 100*A4/(A3 A4) 100*B4/(B3 B4)
我需要一個一般情況,有幾個組,每個組有不同的組大小。
我嘗試使用 for 回圈,雖然我能夠找到列,但我無法將它們分配給資料框。我不明白究竟是什么阻止了它。
例如,這是我要尋找的結果(請注意我如何更改反映“不同組大小”的組列)
Group Col A Col B Per A Per B
1 1 2 100.0 100.0
2 1 2 16.67 25.00
2 2 2 33.33 25.00
2 3 4 50.00 50.00
uj5u.com熱心網友回復:
df = pd.DataFrame({
'Group': [1,1,2,2,3,3,3],
'ColA': [1,2,3,4,5,6,7],
'ColB': [10,22,30,40,50,60,70],
})
df = df.merge(df.groupby(['Group'])['ColA', 'ColB'].sum().reset_index(),
left_on='Group', right_on='Group')
df['PerA'] = df['ColA_x']*100/df['ColA_y']
df['PerB'] = df['ColB_x']*100/df['ColB_y']
df = df.rename(
columns={'ColA_x': 'ColA', 'ColB_x': 'ColB'}).drop(
columns=['ColA_y', 'ColB_y'])
print (df)
輸出:
Group ColA ColB PerA PerB
0 1 1 10 33.333333 31.250000
1 1 2 22 66.666667 68.750000
2 2 3 30 42.857143 42.857143
3 2 4 40 57.142857 57.142857
4 3 5 50 27.777778 27.777778
5 3 6 60 33.333333 33.333333
6 3 7 70 38.888889 38.888889
uj5u.com熱心網友回復:
Groupby 分組然后求和。這為您提供了每組的列總和。
將組設定為索引,然后除以上面的結果。index 可以只劃分相似的索引項。下面的代碼
df.set_index('group').div(df.groupby('group').sum())*100
uj5u.com熱心網友回復:
嘗試groupby transform用update
df.update(df.div(df.groupby('Group').transform('sum'))*100)
df
Out[478]:
Group ColA ColB
0 1 33.333333 31.250000
1 1 66.666667 68.750000
2 2 42.857143 42.857143
3 2 57.142857 57.142857
4 3 27.777778 27.777778
5 3 33.333333 33.333333
6 3 38.888889 38.888889
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/371461.html
