[英]pandas Add new "rank" columns for every column
我有一個像這樣的 df(實際 df 有 450 萬行,23 列):
group feature col1 col2 col3
g1 f1 1 10 100
g1 f1 11 9 1000
g1 f2 0 8 200
g2 f1 2 7 330
g2 f2 3 7 331
g2 f3 1 7 100
g3 f1 1 6 101
g3 f1 5 9 100
g3 f1 1 8 100
我想為我的 df 中的每個列添加兩個新的“等級”列。 我將以不同的方式評估不同的列,例如 sum、mean、max 等。為了便於解釋,我將問題分解為下面兩個單獨的問題。
我在這里被建議使用.loc
而不是使用groupby
,但任何有效的解決方案都很好。 我都嘗試過,但收效甚微(請參閱此處)
第一個排名 col 將根據每個 group中 col1、col2 和 col3 中的值對每個特征進行排名。
在中間階段,它看起來像這樣:
group feature col1 col1_sum col1_rank col2 col2_avg col2_rank col3 col3_max col3_rank
g1 f1 1 12 1 10 9.5 1 100 1000 1
g1 f1 11 9 1000
g1 f2 0 0 2 8 8 2 200 200 2
g2 f1 2 2 2 7 7 1 330 330 2
g2 f2 3 3 1 7 7 1 331 331 1
g2 f3 1 1 3 7 7 1 100 100 3
g3 f1 1 7 1 6 7.67 1 101 101 1
g3 f1 5 9 100
g3 f1 1 8 100
它會輸出這個:
group feature col1_rank col2_rank col3_rank
g1 f1 1 1 1
g1 f2 2 2 2
g2 f1 2 1 2
g2 f2 1 1 1
g2 f3 3 1 3
g3 f1 1 1 1
第二個排名 col 將根據 col1、col2 和 col3中的值對所有其他組按特征對每個組進行排名。
在中間階段,它看起來像這樣:
group feature col1 col1_sum col1_rank col2 col2_avg col2_rank col3 col3_max col3_rank
g1 f1 1 12 1 10 9.5 1 100 1000 1
g1 f1 11 9 1000
g2 f1 2 2 3 7 7 3 330 330 2
g3 f1 1 7 2 6 7.67 2 101 101 3
g3 f1 5 9 100
g3 f1 1 8 100
g1 f2 0 0 2 8 8 1 200 200 2
g2 f2 3 3 1 7 7 2 331 331 1
g2 f3 1 1 1 7 7 1 100 100 1
它會輸出這個:
group feature col1_rank col2_rank col3_rank
g1 f1 1 1 1
g2 f1 3 3 2
g3 f1 2 2 3
g1 f2 2 1 2
g2 f2 1 2 1
g2 f3 1 1 1
我會在['group', 'feature']
上使用groupby
來生成一個包含 sum、avg 和 max 列(不是排名)的中間數據框,然后再次在group
使用groupby
來生成排名。
中間數據框:
df2 = pd.concat([
df.iloc[:,[0,1,2]].groupby(['group', 'feature']).sum(),
df.iloc[:,[0,1,3]].groupby(['group', 'feature']).mean(),
df.iloc[:,[0,1,4]].groupby(['group', 'feature']).max()
], axis=1)
中間數據框是:
col1 col2 col3
group feature
g1 f1 12 9.500000 1000
f2 0 8.000000 200
g2 f1 2 7.000000 330
f2 3 7.000000 331
f3 1 7.000000 100
g3 f1 7 7.666667 101
現在對於最終的數據幀:
df3 = df2.groupby('group').rank(method='min', ascending=False).reset_index()
最后給出:
group feature col1 col2 col3
0 g1 f1 1.0 1.0 1.0
1 g1 f2 2.0 2.0 2.0
2 g2 f1 2.0 1.0 2.0
3 g2 f2 1.0 1.0 1.0
4 g2 f3 3.0 1.0 3.0
5 g3 f1 1.0 1.0 1.0
對於問題的第二部分,我只會更改中間數據幀的索引,並在對'feature'
分組后計算排名:
dfx4 = dfx.reset_index().set_index(['feature', 'group']
).sort_index().groupby('feature').rank(
method='min', ascending=False
).reset_index()
這使:
feature group col1 col2 col3
0 f1 g1 1.0 1.0 1.0
1 f1 g2 3.0 3.0 2.0
2 f1 g3 2.0 2.0 3.0
3 f2 g1 2.0 1.0 2.0
4 f2 g2 1.0 2.0 1.0
5 f3 g2 1.0 1.0 1.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.