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

时间:2013-11-29 02:15:03

标签: python pandas sorting dataframe

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

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

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

我知道如何对数据框中的多个列进行排序,并且知道我可以通过索引的第一个reset_index()来实现我在这里所要求的并对其进行排序,然后再次创建索引。但这样做更直观,更有效吗?

8 个答案:

答案 0 :(得分:27)

修改的 在pandas 0.23中你可以直接这样做 - 参见OmerB' answer

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

df['colFromIndex'] = df.index
df = df.sort(['count', 'colFromIndex'])

我也希望能够像df.sort(['count', 'index'])这样做,但当然不会有用。

答案 1 :(得分:22)

Pandas 0.23 终于使您到达了:-D

您现在可以将索引名称(不仅是列名称)作为参数传递给sort_values。因此,这种单线工作原理:

df = df.sort_values(by = ['MyCol', 'MyIdx'], ascending = [False, True])

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

df = df.rename_axis('MyIdx').sort_values(by = ['MyCol', 'MyIdx'], ascending = [False, True])

答案 2 :(得分:6)

截至pandas版本0.22。

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

df = df.set_index('column_name', append=True).sort_index(level=1).reset_index(level=1)

我认为上述内容可以通过'inplace'选项完成,但我认为上面的内容更容易阅读。

答案 3 :(得分: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)

输出:

   c
1  4
4  4
0  2
2  2
3  2

答案 4 :(得分:1)

您可以使用groupby和apply的组合:

In [2]: df = pd.DataFrame({
            'transID':  range(8),
            'Location': ['New York','Chicago','New York','New York','Atlanta','Los Angeles',
                            'Chicago','Atlanta'],
            'Sales':    np.random.randint(0,10000,8)}).set_index('transID')
In [3]: df
Out[3]:
        Location    Sales
transID
0       New York    1082
1       Chicago     1664
2       New York    692
3       New York    5669
4       Atlanta     7715
5       Los Angeles 987
6       Chicago     4085
7       Atlanta     2927

In [4]: df.groupby('Location').apply(lambda d: d.sort()).reset_index('Location',drop=True)
Out[4]:
        Location    Sales
transID
4       Atlanta     7715
7       Atlanta     2927
1       Chicago     1664
6       Chicago     4085
5       Los Angeles 987
0       New York    1082
2       New York    692
3       New York    5669

我放弃了位置'在最后一行,因为groupby将分组的级别插入索引的第一个位置。排序然后删除它们会保留排序顺序。

答案 5 :(得分:1)

您可以在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

输出:

            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

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

df.sort_values('value_1', ascending=False)\
  .sort_index(level=0, ascending=[True])

输出:

            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

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

答案 6 :(得分:-2)

我相信sort_values的原始订单即使应用了sort_index也会保留,所以这应该有效:

df.sort_values('count', ascending=False).sort_index(level=[index_level1, index_level2])

答案 7 :(得分:-12)

我接下来解决了这个问题:

df.to_csv('df.csv', index = False)
df = df.read_csv('df.csv')