【问题标题】:How to sort a pandas series of both index and values?如何对索引和值的熊猫系列进行排序? [复制]
【发布时间】:2018-01-20 12:31:00
【问题描述】:
我有一个看起来像这样的系列:
146tf150p 1.000000
havent 1.000000
home 1.000000
okie 1.000000
thanx 1.000000
er 1.000000
anything 1.000000
lei 1.000000
nite 1.000000
yup 1.000000
thank 1.000000
ok 1.000000
where 1.000000
beerage 1.000000
anytime 1.000000
too 1.000000
done 1.000000
645 1.000000
tick 0.980166
blank 0.932702
dtype: float64
我想按价值排序,但也按索引排序。所以我会在顶部有最小的数字,但要尊重索引的字母顺序。
【问题讨论】:
标签:
python
pandas
sorting
series
【解决方案1】:
使用np.lexsort获取有序位置并传递给iloc
ser.iloc[np.lexsort([ser.index, ser.values])]
blank 0.932702
tick 0.980166
146tf150p 1.000000
645 1.000000
anything 1.000000
anytime 1.000000
beerage 1.000000
done 1.000000
er 1.000000
havent 1.000000
home 1.000000
lei 1.000000
nite 1.000000
ok 1.000000
okie 1.000000
thank 1.000000
thanx 1.000000
too 1.000000
where 1.000000
yup 1.000000
dtype: float64
【解决方案2】:
我想你可以先把这个系列转移到一个DataFrame中,其中的列是系列的索引和值。然后对 DataFrame 进行排序。要进行传输,只需调用本系列的reset_index 函数并设置drop=False,即可获得数据帧。
这里是例子:
In [38]: s
Out[38]:
0
146tf150p 1.000000
havent 1.000000
home 1.000000
okie 1.000000
thanx 1.000000
er 1.000000
anything 1.000000
lei 1.000000
nite 1.000000
yup 1.000000
thank 1.000000
ok 1.000000
where 1.000000
beerage 1.000000
anytime 1.000000
too 1.000000
done 1.000000
645 1.000000
tick 0.980166
blank 0.932702
Name: 1, dtype: float64
# drop=False, convert to a dataframe
In [39]: df = s.reset_index(drop=False)
# sorting by two columns, first 1 then 0
In [40]: df.sort_values([1,0])
Out[40]:
0 1
19 blank 0.932702
18 tick 0.980166
0 146tf150p 1.000000
17 645 1.000000
6 anything 1.000000
14 anytime 1.000000
13 beerage 1.000000
16 done 1.000000
5 er 1.000000
1 havent 1.000000
2 home 1.000000
7 lei 1.000000
8 nite 1.000000
11 ok 1.000000
3 okie 1.000000
10 thank 1.000000
4 thanx 1.000000
15 too 1.000000
12 where 1.000000
9 yup 1.000000
# sorting by two columns, first 0 column then 1 column
In [41]: df.sort_values([0, 1])
Out[41]:
0 1
0 146tf150p 1.000000
17 645 1.000000
6 anything 1.000000
14 anytime 1.000000
13 beerage 1.000000
19 blank 0.932702
16 done 1.000000
5 er 1.000000
1 havent 1.000000
2 home 1.000000
7 lei 1.000000
8 nite 1.000000
11 ok 1.000000
3 okie 1.000000
10 thank 1.000000
4 thanx 1.000000
18 tick 0.980166
15 too 1.000000
12 where 1.000000
9 yup 1.000000