【问题标题】:Python pandas dataframe sort_values does not workPython pandas 数据框 sort_values 不起作用
【发布时间】:2016-09-20 17:37:24
【问题描述】:

我有以下 pandas 数据框,我想按“test_type”排序

  test_type         tps          mtt        mem        cpu       90th
0  sso_1000  205.263559  4139.031090  24.175933  34.817701  4897.4766
1  sso_1500  201.127133  5740.741266  24.599400  34.634209  6864.9820
2  sso_2000  203.204082  6610.437558  24.466267  34.831947  8005.9054
3   sso_500  189.566836  2431.867002  23.559557  35.787484  2869.7670

我加载数据框并对其进行排序的代码是,第一行打印上面的数据框。

        df = pd.read_csv(file) #reads from a csv file
        print df
        df = df.sort_values(by=['test_type'], ascending=True)
        print '\nAfter sort...'
        print df

在完成排序并打印数据框内容后,数据框仍然如下所示。

程序输出:

After sort...
  test_type         tps          mtt        mem        cpu       90th
0  sso_1000  205.263559  4139.031090  24.175933  34.817701  4897.4766
1  sso_1500  201.127133  5740.741266  24.599400  34.634209  6864.9820
2  sso_2000  203.204082  6610.437558  24.466267  34.831947  8005.9054
3   sso_500  189.566836  2431.867002  23.559557  35.787484  2869.7670

我希望第 3 行(测试类型:sso_500 行)在排序后位于顶部。有人可以帮我弄清楚为什么它不能正常工作吗?

【问题讨论】:

  • 看起来是按test_type排序的,这是一个字符串,按字典顺序排序。我认为您可能需要将 _ 和 zfill 拆分为 4 该列的“数字”部分。

标签: python pandas


【解决方案1】:

大概,您要做的是按sso_ 之后的数值排序。你可以这样做:

import numpy as np

df.ix[np.argsort(df.test_type.str.split('_').str[-1].astype(int).values)

这个

  1. _处拆分字符串

  2. 将此字符后面的内容转换为数值

  3. 查找按数值排序的索引

  4. 根据这些索引对 DataFrame 重新排序

示例

In [15]: df = pd.DataFrame({'test_type': ['sso_1000', 'sso_500']})

In [16]: df.sort_values(by=['test_type'], ascending=True)
Out[16]: 
  test_type
0  sso_1000
1   sso_500

In [17]: df.ix[np.argsort(df.test_type.str.split('_').str[-1].astype(int).values)]
Out[17]: 
  test_type
1   sso_500
0  sso_1000

【讨论】:

  • 我刚刚测试了这个,你是对的。我最终所做的是在我的其他程序(csv 生成器)中重新排列字符串,使其成为 500_sso 而不是 sso_500。它似乎解决了我的问题,我只需要记住以这种方式生成我的测试类型字符串。
  • 500_sso 仍应排在1500_sso 之后。
【解决方案2】:

或者,您也可以从test_type 中提取数字并对其进行排序。然后根据这些索引重新索引DF

df.reindex(df['test_type'].str.extract('(\d+)', expand=False)    \
                          .astype(int).sort_values().index).reset_index(drop=True)

【讨论】:

    猜你喜欢
    • 2017-10-29
    • 2022-11-29
    • 2023-03-24
    • 2018-11-18
    • 2021-11-07
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多