簡體   English   中英

pandas 為每列添加新的“排名”列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM