gpt4 book ai didi

python - pandas 为每列添加新的 "rank"列

转载 作者:行者123 更新时间:2023-12-01 08:14:04 26 4
gpt4 key购买 nike

我有一个像这样的 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 中的每个列添加两个新的“排名”列。我将以不同的方式评估不同的列,例如总和、平均值、最大值等。为了便于解释,我将问题分解为下面两个单独的问题。

我已被告知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

最佳答案

我将在 ['group', 'feature'] 上使用 groupby 来生成包含总和、平均值和最大列(而不是排名)的中间数据帧,然后再次对 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

关于python - pandas 为每列添加新的 "rank"列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55069865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com