是否可以按列的值对pandas数据帧进行排序,还可以按索引进行排序?
如果按列的值对pandas数据框进行排序,则可以按列对结果数据框进行排序,但不幸的是,您会看到数据框索引的顺序在排序列的相同值内混乱。
那么,我可以按列对数据框进行排序,例如名为count
的列,还可以按索引值对其进行排序?是否可以按降序对列进行排序,但是按升序对索引进行排序?
我知道如何对数据框中的多个列进行排序,并且知道我可以通过索引的第一个reset_index()
来实现我在这里所要求的并对其进行排序,然后再次创建索引。但这样做更直观,更有效吗?
答案 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')