Python 熊猫添加新的;排名;每列的列数
我有一个类似的df(实际df有450万行,23列): 我想为df中的每个列添加两个新的“rank”列。我将对不同的col进行不同的评估,例如sum、mean、max等。为了便于解释,我将问题分为以下两个独立的问题 有人建议我使用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
.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不同。