2014-12-15 2 views
2
XList=[2,3,4,5,5,6] 
YList=['A','A','A','B','A','A'] 
df = pd.DataFrame({'X':XList, 
        'Y':YList}) 

df 

    X Y 
0 10 A 
1 3 A 
2 4 A 
3 5 B 
4 5 A 
5 6 A 

Как я могу REORDER только линии 3 и 4 (случай: тот же X-Value), поэтому они находятся в порядке ascedent в Y (A, B), как это:Reorder панды DataFrame с определенными правилами

Everytime Значения X равны, они должны переупорядочивать значения Y.

X Y 
0 10 A 
1 3 A 
2 4 A 
3 5 A 
4 5 B 
5 6 A 
+0

делает 'df.sort (столбцы = [ 'X', 'Y' ]) 'делай, что хочешь? – EdChum

+0

@ EdChum это не совсем то, что я хочу. Я хочу просто иметь возможность сортировать дубликаты на X на основе Y-значений (в порядке возрастания, если X дублируется). Я отредактировал мой вопрос, что было неясно, извините – Hangon

ответ

1

Если вы хотите отсортировать только те значения YList где XList значения равны, вот код:

>>> XList=[2,3,4,5,5,6] 
>>> YList=['A','A','A','B','A','A'] 
>>> idx = [] 
>>> for i in range(len(XList)-1): 
... if XList[i]==XList[i+1]: idx.append(i) 
... else: 
...  if len(idx)>=1: 
...   idx.append(i) 
...   YList[idx[0]:idx[-1]+1] = sorted(YList[idx[0]:idx[-1]+1]) 
...   idx=[] 
... 
>>> YList 
['A', 'A', 'A', 'A', 'B', 'A'] 
>>> df = pd.DataFrame({'X':XList, 
...     'Y':YList}) 
>>> df 
    X Y 
0 2 A 
1 3 A 
2 4 A 
3 5 A 
4 5 B 
5 6 A 
+0

Хороший способ решить спасибо! Интересно, есть ли способ решить одну команду. Правильны ли строки команд быстрее, чем петли? – Hangon

+0

Я не говорю, что это невозможно сделать с помощью одной строки. Может быть один. Но данный случай очень сложный. Нам нужно сначала найти последовательные индексы 'XList', где значения« XList »равны. Затем сортируйте значения YList для этих индексов и продолжайте находить аналогичные индексы 'XList' и сортируйте' YList' до конца 'XList'. Для данного ввода это выглядит просто. Но предположим, что для такого списка '[2,3,4,4,4,5,5,5,5,5,7,8,9,3,3,3,4,4,4, .. ...] ' –

+0

спасибо вам за помощь! – Hangon

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