python如何在dataframe中执行以下操作

2024-09-26 17:42:19 发布

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

我有一个数据框,其中一部分如下所示

df1 = pd.DataFrame({
                   'id1': ['676PA','676RA','197PA','197RA','199PA','199RA','834PA','834RA','950PA','950RA','952PA','952RA','953PA','953RA','954PA','954RA','956PA','956RA'],
                    'Category1' : ['P-L','FL123','P-L','FL123','P-L','FL123','P-L','FL123','FL123','P-L','P-L','FL123','FL123','P-L','FL123','P-L','P-L','FL123'],
                    'Val1' : [-4.0,39.0,-8.0,45.0,-4.0,27.0,-46.0,271.0,-70.0,3.0,-34.0,192.0,-56.0,3.0,-56.0,3.0,-52.0,292.0]
})

每个id有两个条目“PA”和“RA”,对应的类别和Val如下所示

类别的顺序不正确,我希望所有ID的顺序都一致。我希望每个ID的P-L排在第一位,后面是FL123。我已经在下面展示了“电流”以及我希望看到的输出。非常感谢您的帮助

enter image description here


Tags: 数据iddataframe顺序条目类别pdra
1条回答
网友
1楼 · 发布于 2024-09-26 17:42:19

编辑-保留ID的历史顺序

由于您希望保持ID的顺序(因此您希望保持676199等),因此需要创建某种计数,以使用相同的数字对每个ID进行计数(即676R和676PA都等于0,RA和PA的下一个ID都等于1,依此类推……)

您可以做的非常类似,您只需要一个不同的临时列:

  1. 使用.groupby().cumcount()创建一个新的临时列,其中您在Category1上分组,以便它逐个统计每个类别
  2. 在这个新的newID列和Category1列上排序:)
(
    df1
    .assign(temp = df1.groupby('Category1').cumcount())
    .sort_values(['temp','Category1'], ascending=[True, False])
)

注意:只有当每个ID有两个类别时,这才有效

原件-如果不需要保留订单

如评论中所述,如果ID的显示顺序无关紧要(即197PA、197RA可以在整个列表中排在第一位(但同时出现),则可以使用排序。但是,由于您只需要使用数字进行排序,因此需要分两步(可选第三步)进行排序:

  1. 创建一个新列(比如temp_id),将“PA”替换为“RA”(反之亦然)
  2. new_id升序Category1降序排序
  3. 可选:删除temp_id列,因为您不再需要它
(
    df1.assign(temp_id = df1['id1'].str[:-2]) 
    .sort_values(['temp_id','Category1'], ascending=[True, False])
#     .drop('temp_id', axis=1)
)

相关问题 更多 >

    热门问题