【问题标题】:pandas Add new "rank" columns for every columnpandas 为每一列添加新的“排名”列
【发布时间】:2019-03-09 18:58:23
【问题描述】:

我有一个这样的 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 等。为了便于解释,我将问题分为以下两个单独的问题。

我被告知 here 使用 .loc 而不要使用 groupby,但任何可行的解决方案都可以。我都尝试过,但收效甚微(见here

第一个排名 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           
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

【问题讨论】:

    标签: python pandas


    【解决方案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
    

    【讨论】:

    • 谢谢!这对于第一种情况非常有效。我从你的例子中学到了很多。对于第二种情况,我尝试仅对“功能”进行分组,但它给出了错误的结果,这个 3 行中间表将“f”和“组”和“功能”下的数字分开:group feature col1_sum col2_avg col3_max0 f 1 21 8.166667 1000@987654334 @ 2 f 3 1 7.000000 100 注意这里的中介是不同的:特征被分组在一起(所有组的f1,等等)。 sum/avg/max 结果与案例 1 不同。
    猜你喜欢
    • 2018-07-17
    • 2018-06-20
    • 2023-03-11
    • 1970-01-01
    • 2021-11-21
    • 2023-02-03
    • 1970-01-01
    • 2021-12-26
    • 2021-09-30
    相关资源
    最近更新 更多