2013-10-02 2 views
6

У меня есть dataframe Панда называется pd, и я достаю число уникальных значений в одном из столбцов этой dataframe с помощью следующей команды:панда серия Сортировать

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

б является объектом серии панды и внешний вид как это:

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 

Я пытаюсь построить в BarChart этой серии, однако, я хотел бы, чтобы отсортировать его первый основан на первой колонке (из-за того, что 11 между 1 и 2), который будет 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 

Ну, есть способ сортировки этой серии, основанной на первой колонке?

ответ

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. Это как pandas обрабатывает значения индекса как текст. Однако у меня есть '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. Это похоже на то, что pandas обрабатывает значения индекса в виде текста. Однако у меня есть 'N' как одно из значений индекса. – marillion

+0

они МОГУТ быть текстом, как вы его создали? – Jeff

+0

@marillion Ваши ценности - это текст. Вам нужно будет преобразовать числа в числовые типы и использовать индекс dtype объекта. Тогда 'sort_index()' будет делать то, что вы хотите, хотя, скорее всего, лучший способ сделать это, не имея смешанных числовых/строковых индексов. –

Смежные вопросы