【发布时间】:2019-12-24 03:08:47
【问题描述】:
我正在寻找一种有效的方法来重新编号 Python 中分组数据框的等级向量。
在一个简单的数据中,我首先根据counts 对soldier_type 进行排名。到目前为止这很简单! OTOH,我需要根据以下条件重新排列士兵:
如果soldier_type == S1,在regiment和trucks的每一组中,我希望它总是排名为1,然后从排名2开始重新排名其他士兵类型(从最高@ 987654328@ 最低)。
这是我解决这个问题的尝试:
import pandas as pd
from numpy.random import seed
from numpy.random import randint
seed(1234)
raw_data = {'regiment': ['51st', '51st', '51st', '51st', '51st', '51st', '51st', '51st', '51st', '51st', '51st', '51st'],
'trucks': ['MAZ-7310', 'MAZ-7310', 'MAZ-7310', 'MAZ-7310', 'Tatra 810', 'Tatra 810', 'Tatra 810', 'Tatra 810', 'ZIS-150', 'ZIS-150', 'ZIS-150', 'ZIS-150'],
'soldier_type': ['S1', 'S2', 'S3', 'S4', 'S1', 'S3', 'S4', 'S5', 'S1', 'S2', 'S4', 'S5'],
'counts': randint(1,100,12)}
df = pd.DataFrame(raw_data, columns = ['regiment', 'trucks','soldier_type', 'counts'])
regiment trucks soldier_type counts
0 51st MAZ-7310 S1 48
1 51st MAZ-7310 S2 84
2 51st MAZ-7310 S3 39
3 51st MAZ-7310 S4 54
4 51st Tatra 810 S1 77
5 51st Tatra 810 S3 25
6 51st Tatra 810 S4 16
7 51st Tatra 810 S5 50
8 51st ZIS-150 S1 24
9 51st ZIS-150 S2 27
10 51st ZIS-150 S4 31
11 51st ZIS-150 S5 44
def rank_soldier_type (df):
df = df.assign(rank_ = df.groupby(['regiment','trucks'])['counts'].rank(ascending = False,method='dense'))
return df #1st part
#%%
if df.soldier_type != 'S1' and df.rank_ == 1 :
df['new_rank_'] = 1
else:
df['new_rank_'] = df['rank_'].rank(ascending = False,method='dense')
return df
df = rank_soldier_type(df)
如果我运行此函数的第一部分,我可以创建 rank_ 列:
df = rank_soldier_type(df)
regiment trucks soldier_type counts rank_
0 51st MAZ-7310 S1 48 3.0
1 51st MAZ-7310 S2 84 1.0
2 51st MAZ-7310 S3 39 4.0
3 51st MAZ-7310 S4 54 2.0
4 51st Tatra 810 S1 77 1.0
5 51st Tatra 810 S3 25 3.0
6 51st Tatra 810 S4 16 4.0
7 51st Tatra 810 S5 50 2.0
8 51st ZIS-150 S1 24 4.0
9 51st ZIS-150 S2 27 3.0
10 51st ZIS-150 S4 31 2.0
11 51st ZIS-150 S5 44 1.0
预期的输出;
regiment trucks soldier_type counts rank_ new_rank_
0 51st MAZ-7310 S1 48 3.0 1.0
1 51st MAZ-7310 S2 84 1.0 2.0
2 51st MAZ-7310 S3 39 4.0 4.0
3 51st MAZ-7310 S4 54 2.0 3.0
4 51st Tatra 810 S1 77 1.0 1.0
5 51st Tatra 810 S3 25 3.0 3.0
6 51st Tatra 810 S4 16 4.0 4.0
7 51st Tatra 810 S5 50 2.0 2.0
8 51st ZIS-150 S1 24 4.0 1.0
9 51st ZIS-150 S2 27 3.0 4.0
10 51st ZIS-150 S4 31 2.0 3.0
11 51st ZIS-150 S5 44 1.0 2.0
【问题讨论】: