2013-10-02 170 views
6

我有一个熊猫据帧叫pd,我提取该数据帧的使用下面的命令列的一个唯一值的数量:熊猫系列排序

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 

我试图绘制这一系列的条形图,但是,我想基于第一列先解决它(因为是2 11 1之间),这将是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 

嗯,是有办法这一系列基于第一列进行排序?

回答

2

你需要你的指数转换为对象的指数,因为它目前的排序字典顺序,而不是数字:

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,以便它不混合索引类型。

+0

@Philip Cloud谢谢!这似乎解决了排序问题,现在我正在研究如您所提到的那样以更好的方式构建本系列。这整个事情开始时试图计算df列中的唯一值,其中'N'是数据值之一。 – marillion

+0

你去了:) – marillion

+0

@marillion谢谢。 –

13

您正在寻找sort_index

In [80]: b.sort() 
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 
+0

'sort_index()'依然给出与上面'Out [48]'相同的输出,11仍然在1和2之间。这就像熊猫将索引值视为文本一样。尽管我有'N'作为索引值之一。 – marillion

7

有值只有1 '列'。第一个'列'是索引。 Docs are here

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 
+0

我把这个评论留给了bdiamente的回复,但是在这里也是如此:'sort_index()'仍然给出了与上面的Out [48]相同的输出,11仍然在1和2之间。这就像熊猫正在处理索引值作为文本。尽管我有'N'作为索引值之一。 – marillion

+0

他们可能是文本,你是如何创建它? – Jeff

+0

@marillion您的值是文本。您需要将数字转换为数字类型并使用对象dtype索引。然后'sort_index()'会做你想做的事情,尽管最好的办法是在没有混合数字/字符串索引的情况下做到这一点。 –