pandas 对列和索引的值进行排序?

zxlwwiss  于 2023-11-15  发布在  其他
关注(0)|答案(6)|浏览(102)

是否可以通过列的值以及索引对pandas进行排序?
如果你按列的值对pandas的索引框进行排序,你可以得到按列排序的结果索引框,但不幸的是,你会看到在一个排序列的同一个值中,索引框的顺序很乱。
那么,我是否可以按列对一个数组进行排序,比如名为count的列,但也可以按index的值进行排序?是否也可以按降序对一个列进行排序,而按升序对一个索引进行排序?
我知道如何在XML中对多个列进行排序,也知道我可以通过首先reset_index()索引并对其进行排序,然后再次创建索引来实现我在这里要求的内容。但是,这是更直观和有效的方法吗?

kr98yfug

kr98yfug1#

Pandas 0.23终于让你到达那里:-D

现在可以将索引名(而不仅仅是列名)作为参数传递给sort_values。所以,这一行代码可以工作:

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

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

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

uelo1irk

uelo1irk2#

**在pandas 0.23+中,你可以直接这样做-参见OmerB的answer。**如果你还没有0.23+,请继续阅读。

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

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

字符串
我也希望能够只做像df.sort(['count', 'index'])这样的东西,但当然这不起作用。

vi4fp9gy

vi4fp9gy3#

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

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

字符串
我认为上面的可以用“原地”选项来完成,但我认为上面的更容易阅读。

a1o7rhls

a1o7rhls4#

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


注意你必须把sort_index中的ascending参数作为一个列表而不是一个标量来传递。这是不起作用的。

8hhllhi2

8hhllhi25#

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

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

q5lcpyga

q5lcpyga6#

您可以使用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

字符串
我在最后一行中删除了“Location”,因为groupby将分组级别插入到索引的第一个位置。排序后再删除它们将保持排序顺序。

相关问题