Почему функция np.where также работает со значениями - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь изменить значения только определенных значений в кадре данных:

test = pd.DataFrame({'col1': ['a', 'a', 'b', 'c'], 'col2': [1, 2, 3, 4]})
dict_curr = {'a':2}
test['col2'] = np.where(test.col1 == 'a', test.col1.map(lambda x: dict_curr[x]), test.col2)

Однако, похоже, это не работает, потому что, хотя я смотрю только на значения в столбце col1, которые являются 'a', ошибка говорит

KeyError: 'b'

Подразумевается, что он также смотрит на значения col1 со значениями 'b'. Почему это? И как мне это исправить?

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Ошибка происходит из части test.col1.map(lambda x: dict_curr[x]).Вы просматриваете значения из col1 в dict_curr, который имеет запись только для 'a', но не для 'b'.

. Вы также можете просто индексировать фрейм данных:

test.loc[test.col1 == 'a', 'col2'] = 2
1 голос
/ 30 апреля 2019

Проблема в том, что при вызове np.where сначала оцениваются все его параметры, а затем определяется результат в зависимости от условия. Таким образом, словарь запрашивается также для 'b' и 'c', даже если эти значения будут отброшены позже. Наверное, самое простое решение:

import pandas as pd
import numpy as np

test = pd.DataFrame({'col1': ['a', 'a', 'b', 'c'], 'col2': [1, 2, 3, 4]})
dict_curr = {'a': 2}
test['col2'] = np.where(test.col1 == 'a', test.col1.map(lambda x: dict_curr.get(x, 0)), test.col2)

Это даст значение 0 для ключей, отсутствующих в словаре, но, поскольку оно будет отброшено позже, не имеет значения, какое значение вы используете.

Другой простой способ получить тот же результат:

import pandas as pd

test = pd.DataFrame({'col1': ['a', 'a', 'b', 'c'], 'col2': [1, 2, 3, 4]})
dict_curr = {'a': 2}
test['col2'] = test.apply(lambda x: dict_curr.get(x.col1, x.col2), axis=1)
...