在分组d中排列值

2024-09-29 19:25:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种在Python中对分组数据帧的秩向量重新编号的有效方法

在一个简单的数据表中,我首先根据它们的counts排列soldier_type。到目前为止这很简单!奥托,我需要根据以下情况对士兵重新排序:

如果soldier_type == S1,在regimenttrucks的每组中,我希望它总是被排成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

Tags: dfs3types4s2rankcountss5
1条回答
网友
1楼 · 发布于 2024-09-29 19:25:27

通过添加duplicated修复代码

df['New']=df[df[['regiment', 'trucks']].duplicated()].\
            groupby(['regiment', 'trucks'])['counts'].rank(ascending=False, method='dense')+1
df.New.fillna(1,inplace=True)
df
Out[35]: 
   regiment     trucks soldier_type  counts  New
0      51st   MAZ-7310           S1      48  1.0
1      51st   MAZ-7310           S2      84  2.0
2      51st   MAZ-7310           S3      39  4.0
3      51st   MAZ-7310           S4      54  3.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  1.0
9      51st    ZIS-150           S2      27  4.0
10     51st    ZIS-150           S4      31  3.0
11     51st    ZIS-150           S5      44  2.0

相关问题 更多 >

    热门问题