2015-12-23 3 views
2

У меня есть кадр данных pandas, который состоит из 5 столбцов. Во второй колонке число от 1 до 500 повторяется 5 раз. В качестве более короткого примера второй столбец примерно такой: (1,4,2,4,3,1,1,2,4,3,2,1,4,3,2,3) и я хочу отсортировать его как показано на рисунке (1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4). Код, который я использую для сортировки, это df=res.sort([2],ascending=True), но этот код сортирует его (1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4).pandas python сортировка в соответствии с шаблоном

Любая помощь будет очень признательна. Благодаря

+0

У вас есть еще один столбец с теми пятью различными видами записей, так как те, дважды? Так же, как A -> 1, A -> 2, A -> 3, A -> 4, ... A -> 500, B -> 1, B -> 2, ... B -> 500, ..., E -> 1, E -> 2, E -> 3, ..., E -> 5. Если это так, вы можете использовать это как комбинированный индекс в чтобы сортировать данные правильно. Вставьте небольшой фрагмент вашего полного информационного фрейма или, по крайней мере, значительную его часть. – albert

+0

, поэтому у меня есть 10 -> 1,10 -> 1,10 -> 1,10 -> 1, 10 -> 2, ..., 10 -> 2, 10 -> 3, .., 10 -> 3, 10 -> 4, .., 10 -> 4, затем 20 -> 1, ......., 20 -> 4, затем 30 -> 1, ... 30 -> 4 и так далее до 100 – motaha

ответ

5

Как про это: sort по cumcount, а затем само значение:

In [11]: df = pd.DataFrame({"s": [1,4,2,4,3,1,1,2,4,3,2,1,4,3,2,3]}) 

In [12]: df.groupby("s").cumcount() 
Out[12]: 
0  0 
1  0 
2  0 
3  1 
4  0 
5  1 
6  2 
7  1 
8  2 
9  1 
10 2 
11 3 
12 3 
13 2 
14 3 
15 3 
dtype: int64 

In [13]: df["s_cumcounts"] = df.groupby("s").cumcount() 

In [14]: df.sort_values(["s_cumcounts", "s"]) 
Out[14]: 
    s s_cumcounts 
0 1   0 
2 2   0 
4 3   0 
1 4   0 
5 1   1 
7 2   1 
9 3   1 
3 4   1 
6 1   2 
10 2   2 
13 3   2 
8 4   2 
11 1   3 
14 2   3 
15 3   3 
12 4   3 

In [15]: df = df.sort_values(["s_cumcounts", "s"]) 

In [16]: del df["s_cumcounts"] 
+1

очень крутой ответ! – maxymoo

+1

Удивительный ответ. –

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