Python 按索引对系列进行排序

Python 按索引对系列进行排序,python,pandas,sorting,Python,Pandas,Sorting,我有一个名为pd的Pandas数据帧,我使用以下命令提取此数据帧的一列中唯一值的数量: b = df.groupby('Region').size() b是熊猫系列对象,如下所示: In [48]: b Out[48]: Region 0 8 1 25 11 1 2 41 3 23 4 15 5 35 6 24 7 27 8 50

我有一个名为
pd
的Pandas数据帧,我使用以下命令提取此数据帧的一列中唯一值的数量:

b = df.groupby('Region').size()
b是熊猫系列对象,如下所示:

In [48]: b
Out[48]: 
Region
0          8
1         25
11         1
2         41
3         23
4         15
5         35
6         24
7         27
8         50
9         55
N         10
我正在尝试绘制本系列的条形图,但是,我想首先根据第一列对其进行排序(因为1和2之间有11列),这将是x轴标签。我尝试传递sort命令,但它根据第二列中的值对序列进行排序:

b.sort()

In [48]: b
Out[54]: 
Region
11         1
0          8
N         10
4         15
3         23
6         24
1         25
7         27
5         35
2         41
8         50
9         55
那么,有没有办法根据第一列对本系列进行排序?

您正在寻找:


只有一列值。第一列是索引。

按索引排序

In [10]: s.sort_index()
Out[10]: 
1    3
2    1
3    2
dtype: int64
按值排序

In [11]: s.sort_values()
Out[11]: 
2    1
3    2
1    3
dtype: int64

您需要将索引转换为对象索引,因为它当前按字典顺序排序,而不是按数字排序:

In [97]: s = read_clipboard(header=None)

In [98]: news = s.rename(columns=lambda x: ['Region', 'data'][x])

In [99]: news
Out[99]:
   Region  data
0       0     8
1       1    25
2      11     1
3       2    41
4       3    23
5       4    15
6       5    35
7       6    24
8       7    27
9       8    50
10      9    55
11      N    10

In [100]: news_converted = news.convert_objects(convert_numeric=True)

In [101]: news_converted
Out[101]:
    Region  data
0        0     8
1        1    25
2       11     1
3        2    41
4        3    23
5        4    15
6        5    35
7        6    24
8        7    27
9        8    50
10       9    55
11     NaN    10

In [102]: news_converted.loc[11, 'Region'] = 'N'

In [103]: news_converted_with_index = news_converted.set_index('Region')

In [104]: news_converted_with_index
Out[104]:
        data
Region
0.0        8
1.0       25
11.0       1
2.0       41
3.0       23
4.0       15
5.0       35
6.0       24
7.0       27
8.0       50
9.0       55
N         10

In [105]: news_converted_with_index.sort_index()
Out[105]:
        data
Region
0.0        8
1.0       25
2.0       41
3.0       23
4.0       15
5.0       35
6.0       24
7.0       27
8.0       50
9.0       55
11.0       1
N         10

很可能有一种更好的方法来创建您的
系列
,这样它就不会混合索引类型。

sort\u index()
仍然会提供与上面的
Out[48]
相同的输出,11仍然在1和2之间。就像熊猫把索引值当作文本一样。不过,我确实有
N
作为索引值之一。我把这条评论留给了bdiamente的回复,但这里也是:
sort\u index()
仍然给我与上面的
Out[48]
相同的输出,11仍然在1和2之间。就像熊猫把索引值当作文本一样。我确实有
N
作为索引值之一。它们可能是文本,你是如何创建的?@marillion你的值是文本。您需要将数字转换为数字类型,并使用对象数据类型索引。然后,
sort_index()
将执行您想要的操作,尽管很可能有更好的方法来执行此操作,而不必使用混合的数字/字符串索引。@Jeff df是使用pd.read_csv('filename.csv')构造的,然后我使用
groupby
来计算唯一值的数量。可能数据中的“N”值导致了一个文本类型的索引。啊……没有看到N,是的,肯定是这样,它会自动显示文本。最好将thin放在一个数据框中,用一个数字替换该值,这样就可以很好地运行了。@Philip Cloud谢谢!这似乎解决了排序问题,现在我正在研究如何更好地构建这个系列,正如您所提到的。这一切都是从尝试计算df列中的唯一值开始的,df列中的“N”是数据值之一。这个问题是关于按索引对pandas系列进行排序的。如果希望了解如何按值对序列进行排序,请参阅。
In [11]: s.sort_values()
Out[11]: 
2    1
3    2
1    3
dtype: int64
In [97]: s = read_clipboard(header=None)

In [98]: news = s.rename(columns=lambda x: ['Region', 'data'][x])

In [99]: news
Out[99]:
   Region  data
0       0     8
1       1    25
2      11     1
3       2    41
4       3    23
5       4    15
6       5    35
7       6    24
8       7    27
9       8    50
10      9    55
11      N    10

In [100]: news_converted = news.convert_objects(convert_numeric=True)

In [101]: news_converted
Out[101]:
    Region  data
0        0     8
1        1    25
2       11     1
3        2    41
4        3    23
5        4    15
6        5    35
7        6    24
8        7    27
9        8    50
10       9    55
11     NaN    10

In [102]: news_converted.loc[11, 'Region'] = 'N'

In [103]: news_converted_with_index = news_converted.set_index('Region')

In [104]: news_converted_with_index
Out[104]:
        data
Region
0.0        8
1.0       25
11.0       1
2.0       41
3.0       23
4.0       15
5.0       35
6.0       24
7.0       27
8.0       50
9.0       55
N         10

In [105]: news_converted_with_index.sort_index()
Out[105]:
        data
Region
0.0        8
1.0       25
2.0       41
3.0       23
4.0       15
5.0       35
6.0       24
7.0       27
8.0       50
9.0       55
11.0       1
N         10