Python 熊猫添加新的;排名;每列的列数

Python 熊猫添加新的;排名;每列的列数,python,pandas,Python,Pandas,我有一个类似的df(实际df有450万行,23列): 我想为df中的每个列添加两个新的“rank”列。我将对不同的col进行不同的评估,例如sum、mean、max等。为了便于解释,我将问题分为以下两个独立的问题 有人建议我使用.loc,不要使用groupby,但任何有效的解决方案都可以。我尝试了这两种方法,但几乎没有成功(参见) 第一列col将根据每组中col1、col2和col3中的值对每个要素进行排序 在中间阶段,它看起来像这样: group feature col1 col1_su

我有一个类似的df(实际df有450万行,23列):

我想为df中的每个列添加两个新的“rank”列。我将对不同的col进行不同的评估,例如sum、mean、max等。为了便于解释,我将问题分为以下两个独立的问题

有人建议我使用
.loc
,不要使用
groupby
,但任何有效的解决方案都可以。我尝试了这两种方法,但几乎没有成功(参见)

第一列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  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
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
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
第二个列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  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
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
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)
df3 = df2.groupby('group').rank(method='min', ascending=False).reset_index()
中间数据帧是:

               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
现在来看最后一个数据帧:

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)
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

非常感谢。这在第一种情况下非常有效。我从你的例子中学到了很多。对于第二种情况,我尝试仅对“feature”进行分组,但它给出了错误的结果,即拆分“f”的3行中间表“组”和“特征”下的数字:
group feature col1\u sum col2\u avg col3\u max
0f 1218.166667 1000
1f 237.500000 331
2f 317.000000100
注意中间层不同:特征被分组在一起(f1适用于所有组等)。总和/平均值/最大值结果与情况1不同。