【问题标题】:Pandas: how to sort dataframe by column AND by indexPandas:如何按列和索引对数据框进行排序
【发布时间】:2018-08-27 12:36:28
【问题描述】:

给定 DataFrame:

import pandas as pd
df = pd.DataFrame([6, 4, 2, 4, 5], index=[2, 6, 3, 4, 5], columns=['A'])

结果:

   A
2  6
6  4
3  2
4  4
5  5

现在,我想按 A 列的值和索引进行排序。

例如

df.sort_values(by='A')

返回

   A
3  2
6  4
4  4
5  5
2  6

我想要

   A
3  2
4  4
6  4
5  5
2  6

如何先对列进行排序,然后再对索引进行排序?

【问题讨论】:

    标签: python pandas sorting dataframe


    【解决方案1】:

    您可以使用kind='mergesort'按索引然后按A列排序。

    这是因为mergesort is stable

    res = df.sort_index().sort_values('A', kind='mergesort')
    

    结果:

       A
    3  2
    4  4
    6  4
    5  5
    2  6
    

    【讨论】:

    • 看起来lexsort 来自numpymergesort 快一点。
    • 我同意,我认为这个解决方案更容易阅读。 +1 谢谢!
    【解决方案2】:

    在 numpy 中使用 lexsort 可能是另一种方式,而且速度也快一点:

    df.iloc[np.lexsort((df.index, df.A.values))] # Sort by A.values, then by index
    

    结果:

       A
    3  2
    4  4
    6  4
    5  5
    2  6
    

    timeit比较:

    %%timeit
    df.iloc[np.lexsort((df.index, df.A.values))] # Sort by A.values, then by index
    

    结果:

    1000 loops, best of 3: 278 µs per loop
    

    重置索引并再次设置索引:

     %%timeit
    df.reset_index().sort_values(by=['A','index']).set_index('index')
    

    结果:

    100 loops, best of 3: 2.09 ms per loop
    

    【讨论】:

    • 如何为多索引数据帧执行此操作?
    【解决方案3】:

    其他答案很棒。我将提供另一个选项,即首先使用rename_axis 为索引提供一个名称,然后在sort_values 中引用它。我尚未测试性能,但希望接受的答案仍然更快。

    df.rename_axis('idx').sort_values(by=['A', 'idx'])

         A
    idx   
    3    2
    4    4
    6    4
    5    5
    2    6
    

    如果您愿意,可以在之后使用df.index.name = None 清除索引名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 2022-08-19
      • 1970-01-01
      相关资源
      最近更新 更多