按索引对Pandas系列进行排序

9

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

b = df.groupby('Region').size()
b 是一个 Pandas series 对象,其外观如下所示:
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轴标签。我尝试通过传递排序命令来排序,但它基于第二列中的值进行排序:

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

有没有一种方法可以根据第一列对这个系列进行排序?

这个问题涉及到如何按照 pandas Series 的 index 进行排序。如果您想知道如何按值对 Series 进行排序,请参阅此帖子 - cs95
3个回答

16
您正在寻找 sort_index 函数:
In [80]: b.sort_values()
Out[80]: 
6     1
11    2
9     2
1     4
10    4
2     5
3     6
4     7
8     8
5     9
dtype: int64

In [81]: b.sort_index()
Out[81]: 
1     4
2     5
3     6
4     7
5     9
6     1
8     8
9     2
10    4
11    2
dtype: int64

sort_index() 仍然给我相同的输出,与上面的 Out[48] 相同,11 仍然在 1 和 2 之间。就像 pandas 将索引值视为文本一样。不过,我的索引值中确实有一个是 N - marillion

8

这里只有1列数值。第一列是索引。

文档在这里
In [8]: s = Series([3,2,1],index=[1,3,2])

In [9]: s
Out[9]: 
1    3
3    2
2    1
dtype: int64

按索引排序
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

我留下了这个评论给bdiamente的回复,但是我也在这里说一下:sort_index()仍然给我相同的输出,与上面的Out[48]一样,11仍然在1和2之间。就像pandas将索引值视为文本一样。不过,我的索引值中确实有一个是N - marillion
它们可能是文本,你是怎么创建它们的? - Jeff
@Jeff,df是使用pd.read_csv('filename.csv')构建的,然后我使用groupby计算唯一值的数量。也许数据中的'N'值导致了一个文本类型的索引。 - marillion
啊...没看到N,是的,它自动以文本方式呈现。最好将其放入DataFrame中,用数字替换该值,然后您就可以继续了。 - Jeff
@Jeff,这就是我最终所做的。N现在是111。我可能会稍后在matplotlib中调整条形图刻度线。感谢您的帮助! - marillion
显示剩余2条评论

5
您需要将索引转换为对象索引,因为当前是按字典顺序而不是数字顺序进行排序:
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

很可能有更好的方法来创建你的Series,使其不混合索引类型。


@Philip Cloud 谢谢!这似乎解决了排序的问题,现在我正在研究如何按照你提到的更好的方式构建这个系列。整个问题始于尝试计算df列中唯一值的数量,其中包含“N”作为其中一个数据值。 - marillion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接