2013-10-02 38 views
6

Tôi có một dataframe Pandas gọi pd, và tôi trích xuất các số giá trị duy nhất trong một trong các cột của dataframe này bằng cách sử dụng lệnh sau:Pandas Dòng Sắp xếp

b = df.groupby('Region').size() 

b là một đối tượng loạt Pandas và vẻ như thế này:

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 

tôi cố gắng để vẽ một barchart của loạt bài này, tuy nhiên, tôi muốn sắp xếp nó đầu tiên dựa trên cột đầu tiên (vì lý do đó 11 giữa 1 và 2), đó sẽ là nhãn trục x. Tôi đã thử chuyển lệnh sắp xếp, nhưng nó sắp xếp chuỗi dựa trên các giá trị trong cột thứ hai:

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 

Vâng, có cách nào sắp xếp chuỗi này dựa trên cột đầu tiên không?

Trả lời

2

Bạn cần phải chuyển đổi chỉ số của bạn đến một chỉ số đối tượng, vì nó hiện đang sắp xếp thứ tự từ điển, không phải số lượng:

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 

Có nhiều khả năng là cách tốt nhất để tạo Series để nó không kết hợp các loại chỉ mục.

+0

@Philip Cloud cảm ơn! điều này dường như giải quyết vấn đề phân loại, bây giờ tôi đang xem xét việc xây dựng loạt bài này theo cách tốt hơn như bạn đã đề cập. Toàn bộ điều này bắt đầu bằng cách cố gắng đếm các giá trị duy nhất trong một cột df, trong đó có 'N' là một trong các giá trị dữ liệu. – marillion

+0

Có bạn đi :) – marillion

+0

@marillion Cảm ơn. –

13

Bạn đang tìm kiếm 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()' vẫn cho tôi kết quả tương tự với 'Out [48]' ở trên, 11 vẫn nằm trong khoảng từ 1 đến 2. Giống như gấu trúc đang xử lý các giá trị chỉ mục dưới dạng văn bản. Tôi có 'N' là một trong những giá trị chỉ số mặc dù. – marillion

7

Chỉ có 1 'cột' các giá trị. Cột 'đầu tiên' đầu tiên là chỉ mục. 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 

Sắp xếp theo chỉ số

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

Sắp xếp theo giá trị

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

Tôi để lại bình luận này để trả lời của bdiamente, nhưng ở đây nó cũng như: 'sort_index()' vẫn cho tôi cùng một kết quả với 'Out [48]' ở trên, 11 vẫn nằm trong khoảng từ 1 đến 2. Nó giống như gấu trúc đang xử lý các giá trị chỉ mục dưới dạng văn bản. Tôi có 'N' là một trong những giá trị chỉ số mặc dù. – marillion

+0

chúng CÓ THỂ là văn bản, bạn đã tạo nó bằng cách nào? – Jeff

+0

@marillion Giá trị của bạn là văn bản. Bạn sẽ cần phải chuyển đổi các số thành kiểu số và sử dụng một chỉ số dtype đối tượng. Sau đó 'sort_index()' sẽ làm những gì bạn muốn, mặc dù có nhiều khả năng một cách tốt hơn để làm điều này mà không có các chỉ số hỗn hợp số/chuỗi. –

Các vấn đề liên quan