gpt4 book ai didi

python - 对 pandas 分组的列进行排序

转载 作者:行者123 更新时间:2023-11-30 22:47:41 24 4
gpt4 key购买 nike

我正在处理一些机器学习任务,我想将每一行从“编号对象”更改为“按某些属性对象排序”。

例如,我有 2 个团队中的 5 个英雄,由他们的统计数据(dN_%stat% 和 rN_%stat%)表示,我想要的是按统计数据编号 3,4,0,2 对每个团队中的英雄进行排序所以第一个最强,依此类推。

这是我当前的代码,但它非常慢,所以我想使用 native pandas 对象和操作:

def sort_heroes(df):
for match_id in df.index:
for team in ['r', 'd']:
heroes = []
for n in range(1,6):
heroes.append(
[df.ix[match_id, '%s%s_%s' % (team, n, stat)]
for stat in stats])

heroes.sort(key=lambda x: (x[3], x[4], x[0], x[2]))
for n in range(1,6):
for i, stat in enumerate(stats):
df.ix[match_id, '%s%s_%s' %
(team, n, stat)] = heroes[n - 1][i]

简短的示例,其中不完整但有用的数据表示:

match_id  r1_xp  r1_gold  r2_xp  r2_gold  r3_xp  r3_gold  d1_xp  d1_gold d2_xp d2_gold
1 10 20 100 10 5000 300 0 0 15 5
2 1 1 1000 80 100 13 200 87 311 67

我想要的是按前缀(rN_ 和 dN_)的组对这些列进行排序,首先按 gold,然后按 xp

match_id  r1_xp  r1_gold  r2_xp  r2_gold  r3_xp  r3_gold  d1_xp  d1_gold d2_xp d2_gold
1 5000 300 10 20 100 20 15 5 0 0
2 1000 80 100 13 1 1 200 87 311 67

最佳答案

您可以使用:

df.set_index('match_id', inplace=True)
#create MultiIndex with 3 levels
arr = df.columns.str.extract('([rd])(\d*)_(.*)', expand=True).T.values
df.columns = pd.MultiIndex.from_arrays(arr)
#reshape df, sorting
df = df.stack([0,1]).reset_index().sort_values(['match_id','level_1','gold','xp'],
ascending=[True,False,False,False])
print (df)
match_id level_1 level_2 gold xp
4 1 r 3 300.0 5000.0
2 1 r 1 20.0 10.0
3 1 r 2 10.0 100.0
1 1 d 2 5.0 15.0
0 1 d 1 0.0 0.0
8 2 r 2 80.0 1000.0
9 2 r 3 13.0 100.0
7 2 r 1 1.0 1.0
5 2 d 1 87.0 200.0
6 2 d 2 67.0 311.0

#asign new values to level 2
df.level_2 = df.groupby(['match_id','level_1']).cumcount().add(1).astype(str)
#get original shape
df = df.set_index(['match_id','level_1','level_2']).stack().unstack([1,2,3]).astype(int)
df = df.sort_index(level=[0,1,2], ascending=[False, True, False], axis=1)
#Multiindex in columns to column names
df.columns = ['{}{}_{}'.format(x[0], x[1], x[2]) for x in df.columns]
df.reset_index(inplace=True)
print (df)
match_id r1_xp r1_gold r2_xp r2_gold r3_xp r3_gold d1_xp d1_gold \
0 1 5000 300 10 20 100 10 15 5
1 2 1000 80 100 13 1 1 200 87

d2_xp d2_gold
0 0 0
1 311 67

关于python - 对 pandas 分组的列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40453417/

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