Панды: обновить значение, если условие выполнено в цикле - PullRequest
0 голосов
/ 02 ноября 2018

Я должен обновить столбец фрейма данных, если условие выполнено. Но есть несколько условий и несколько значений для обновления. Поэтому я хочу сделать это в цикле.

Фрейм данных выглядит так:

mode  car1  car2  bus1  bus2
car1   10    20    5     2
car2   11    22    3     1
bus1   4     4     2     2  
bus2   3     4     3     5

Я понимаю, что структура данных немного странная, но давайте продолжим. Если mode говорит car1, я хочу, чтобы новое значение столбца имело значение в столбце car1. И так далее.

Мой код похож на:

targets = ['car1', 'car2', 'bus1', 'bus2']
for target in targets:
    df.loc[(df.mode==f'target'),'value']=df.[target]

Это работает, но каждый из них заменяет строки, в которых условие не выполняется, NaN. Поэтому я получаю только столбец нового значения, содержащий значение для bus2 в строках bus2, но NaN во всех других строках.

В Stata я бы написал:

gen value = .
foreach x in car1 car2 bus1 bus2 {
replace value = `x' if mode=="`x'"
}

Ищем похожий код в Python!

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

В pandas есть lookup

df['newvalue']=df.set_index('mode').lookup(df['mode'],df['mode'])
df
Out[184]: 
   mode  car1  car2  bus1  bus2  newcol  newvalue
0  car1    10    20     5     2      10        10
1  car2    11    22     3     1      22        22
2  bus1     4     4     2     2       2         2
3  bus2     3     4     3     5       5         5
0 голосов
/ 02 ноября 2018

Это должно работать:

df['newcol'] = 0
for key, item in df.iterrows():
    df['newcol'].iloc[key] = item[item['mode']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...