【问题标题】:Sort only parts of pandas Dataframe based on column values根据列值仅对熊猫数据框的部分进行排序
【发布时间】:2022-07-19 20:51:12
【问题描述】:

我对@9​​87654321@ 提出的问题有一个后续问题。

我的 pandas 数据框由几列组成,第一列有字符串值,其他列有浮点数。它看起来像这样:

Superheros        hourly rate
Spiderman (Nr 1)   12.9
Batman (Nr 4)      93.7
Joker              23.6
Iron Man (Nr 2)    49.3
Hulk               32.5
Captain America    24.9
Wonderwoman (Nr 3) 65.8

一般而言,数据框应根据小时费率列进行排序,但所有带有数字的超级英雄都应位于数据框的底部。生成的数据框应如下所示

Superheros        hourly rate
Hulk               32.5
Captain America    24.9
Joker              23.6
Batman (Nr 4)      93.7
Wonderwoman (Nr 3) 65.8
Iron Man (Nr 2)    49.3
Spiderman (Nr 1)   12.9

在我之前的问题中,我没有按第二列排序的条件,建议的解决方案导致了这个代码片段:

df['Superheros'] = df['Superheros'].str.replace(r'\bim\s+(Nr\s*\d+)', r'(\1)', regex=True)
df = df.replace(np.nan, '-')
s = pd.to_numeric(df['Superheros'].str.extract('\(VG (\d+)\)', expand=False))
idx = s.sort_values(na_position='first').index
df = df.loc[idx]

基于建议使用的相同逻辑:

sorter = lambda s: pd.to_numeric(s.str.extract('\(Nr (\d+)\)', expand=False))

out = df.sort_values(by='Superheros', key=sorter, na_position='first')

所以我想我可以简单地将 by='Superheros' 更改为 by='hourly rate',但这不起作用(我想我明白为什么)。不幸的是,我对如何做到这一点没有任何其他想法,除了可能将数据框分成两部分,分别对它们进行排序,然后将它们重新合并在一起。有没有更好的 Pythonic 方式来做到这一点?

提前致谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用临时列以数字对超级英雄进行排序:

    (df
     .assign(bottom=df['Superheros'].str.contains('\d\)'))
     .sort_values(by=['bottom', 'hourly rate'], ascending=[True, False])
     .drop(columns='bottom')
    )
    

    输出:

               Superheros  hourly rate
    4                Hulk         32.5
    5     Captain America         24.9
    2               Joker         23.6
    1       Batman (Nr 4)         93.7
    6  Wonderwoman (Nr 3)         65.8
    3     Iron Man (Nr 2)         49.3
    0    Spiderman (Nr 1)         12.9
    

    中级(不删除“底部”列):

    True (=1) 排在False (=0) 之后。

               Superheros  hourly rate  bottom
    4                Hulk         32.5   False
    5     Captain America         24.9   False
    2               Joker         23.6   False
    1       Batman (Nr 4)         93.7    True
    6  Wonderwoman (Nr 3)         65.8    True
    3     Iron Man (Nr 2)         49.3    True
    0    Spiderman (Nr 1)         12.9    True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-29
      • 2013-12-15
      • 2015-11-06
      • 2021-10-07
      • 2012-06-19
      • 1970-01-01
      • 2021-02-27
      • 2014-04-23
      相关资源
      最近更新 更多