我正在寻找一种在Python中对分组数据帧的秩向量重新编号的有效方法
在一个简单的数据表中,我首先根据它们的counts
排列soldier_type
。到目前为止这很简单!奥托,我需要根据以下情况对士兵重新排序:
如果soldier_type == S1
,在regiment
和trucks
的每组中,我希望它总是被排成1
,然后从2
(从最高的counts
到最低的)重新排列其他士兵类型
下面是我解决这个问题的尝试:
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
通过添加
duplicated
修复代码相关问题 更多 >
编程相关推荐