2017-02-17 4 views
0

Потянув мои волосы за это, хотя я уверен, что кто-то предоставит простой ответ.Выберите значение столбца Dataframe Pandas, основанное на другом значении столбца

data = [{'check': None, 'iterator': 1, 'x1': 1, 'x2': 2, 'x3':3}, 
     {'check': None, 'iterator': 2, 'x1': 1, 'x2': 2, 'x3':3}, 
     {'check': None, 'iterator': 3, 'x1': 1, 'x2': 2 , 'x3':3}] 
df = pd.DataFrame(data) 
display(df) 

enter image description here

Я пытаюсь заполнить столбец проверки путем сдвига ИНГ вправо на значение в колонке «итератор». То есть первая строка «проверки» будет 1, вторая будет равна 2, третья - 3.

Это упрощение гораздо большего набора данных, над которым я работаю, поэтому я бы оценил векторизованное код.

+0

По любой причине вы не можете просто 'df ['check'] = df ['iterator']'? – chrisaycock

+0

Было бы здорово, если бы вы также могли предоставить выходной dataframe здесь и в вопросе. – titipata

ответ

0

Вы можете использовать numpy «s advanced indexing:

df['check'] = df.filter(like="x").values[np.arange(len(df)), df.iterator - 1] 

enter image description here


Чтобы избежать двусмысленности, вот другой пример:

data = [{'check': None, 'iterator': 2, 'x1': 3, 'x2': 4, 'x3':3}, 
     {'check': None, 'iterator': 1, 'x1': 1, 'x2': 5, 'x3':3}, 
     {'check': None, 'iterator': 2, 'x1': 2, 'x2': 2 , 'x3':1}] 
df = pd.DataFrame(data) 

df['check'] = df.filter(like="x").values[np.arange(len(df)), df.iterator-1] 
df 

enter image description here

+0

Спасибо! Спасибо! Спасибо! – brettq

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