2013-10-02 169 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()'會做你想做的事情,儘管最好的辦法是在沒有混合數字/字符串索引的情況下做到這一點。 –