在列和索引的值上对pandas数据帧进行排序?

Bla*_*ard 34 python sorting dataframe pandas

是否可以按列的值对pandas数据帧进行排序,还可以通过索引进行排序?

如果按列的值对pandas数据框进行排序,则可以按列对结果数据框进行排序,但不幸的是,您会看到数据框索引的顺序在排序列的相同值内混乱.

那么,我可以按列对数据框进行排序,例如命名列,count还可以按索引值对其进行排序?是否可以按降序对列进行排序,但是按升序对索引进行排序?

我知道如何在数据框中对多个列进行排序,并且还知道我可以通过首先reset_index()对索引进行排序并对其进行排序,然后再次创建索引.但这样做是否更直观,更有效?

Ome*_*erB 30

熊猫0.23终于让你在那里:-D

您现在可以将索引名称(而不仅仅是列名称)作为参数传递给sort_values.所以,这个单线工程:

df = df.sort_values(by = ['MyCol', 'MyIdx'], ascending = [False, True])
Run Code Online (Sandbox Code Playgroud)

如果您的索引当前未命名:

df = df.rename_axis('MyIdx').sort_values(by = ['MyCol', 'MyIdx'], ascending = [False, True])
Run Code Online (Sandbox Code Playgroud)

  • 好的,绝对是最灵活的答案,应该成为推荐的方法。 (2认同)
  • 确保您的索引有一个名称“df.index.name” (2认同)

fan*_*ous 27

编辑 在pandas 0.23中你可以直接进行 - 参见OmerB的回答.


我敢说,最简单的方法是将索引复制到一列,然后按两者排序.

df['colFromIndex'] = df.index
df = df.sort(['count', 'colFromIndex'])
Run Code Online (Sandbox Code Playgroud)

我也希望能够做一些类似的事情df.sort(['count', 'index']),但当然这不起作用.

  • _just做类似`df.sort(['count','index'])`_现在可以了,从pandas 0.23开始.请参阅下面的[answer](/sf/answers/3690465551/). (4认同)
  • 注意:sort已被弃用.sort_values现在正在使用中. (3认同)

Iai*_*n D 6

截至pandas版本0.22.

您可以临时将列设置为索引,对该列上的索引进行排序,然后重置.默认情况下,它将维护现有索引的顺序:

df = df.set_index('column_name', append=True).sort_index(level=1).reset_index(level=1)
Run Code Online (Sandbox Code Playgroud)

我认为以上可以通过'inplace'选项完成,但我认为它更容易阅读如上所述.


Sco*_*ton 5

您可以在 sort_index 中使用升序参数,但必须将其作为列表传递,以便从 pandas 0.22.0 开始正确工作。

import pandas as pd
import numpy as np
df = pd.DataFrame({'idx_0':[2]*6+[1]*5,
                   'idx_1':[6,4,2,10,18,5,11,1,7,9,3],
                   'value_1':np.arange(11,0,-1),
                   'MyName':list('SORTEDFRAME')})

df = df.set_index(['idx_0','idx_1'])
df
Run Code Online (Sandbox Code Playgroud)

输出:

            MyName  value_1
idx_0 idx_1                
2     6          S       11
      4          O       10
      2          R        9
      10         T        8
      18         E        7
      5          D        6
1     11         F        5
      1          R        4
      7          A        3
      9          M        2
      3          E        1
Run Code Online (Sandbox Code Playgroud)

按值和索引排序应该得到“FRAMESORTED”而不是“SORTEDFRAME”

df.sort_values('value_1', ascending=False)\
  .sort_index(level=0, ascending=[True])
Run Code Online (Sandbox Code Playgroud)

输出:

            MyName  value_1
idx_0 idx_1                
1     11         F        5
      1          R        4
      7          A        3
      9          M        2
      3          E        1
2     6          S       11
      4          O       10
      2          R        9
      10         T        8
      18         E        7
      5          D        6
Run Code Online (Sandbox Code Playgroud)

请注意,您必须将ascending参数sort_index作为列表而不是标量传递。不起作用。


cyb*_*org 1

要对列进行降序排序,同时保持索引升序:

import pandas as pd
df = pd.DataFrame(index=range(5), data={'c': [4,2,2,4,2]})
df.index = df.index[::-1]
print df.sort(column='c', ascending=False)
Run Code Online (Sandbox Code Playgroud)

输出:

   c
1  4
4  4
0  2
2  2
3  2
Run Code Online (Sandbox Code Playgroud)