Использование словаря для замены элементов в объекте Series на основе условия из другой серии - PullRequest
0 голосов
/ 05 октября 2019

У меня есть датафрейм с серией штатов и страной. Ряд стран имеет несколько пропущенных значений. У меня есть словарь штатов США, который я использовал для очистки серии Штаты. Я хочу использовать это, чтобы сказать, что если государство находится в словаре, то страна должна быть США.

Я могу использовать словарь состояний, сопоставленный с США, т. Е. {'AL': 'USA', 'AK': 'USA' ...}, а затем использовать df['Country']= df['Country'].map(dict), но я уверен, что есть лучший / умный / простой способ сделать это.

Я пробовал это:

test = df[['State', 'Country']]
for a, b in test.itertuples(index=False):
    if a in us_state_abbrev.values():
        b = "USA"
    elif a in ca_province_abbrev.values():
        b = "Canada"

, где test.head() возвращает:

         State       Country
0          MO           NaN
1          IA           USA
2          MI           NaN
3          AB        Canada
4          ON        Canada

и us_state_abbrev = {'Alabama': 'AL', 'Alaska': 'AK' ...}

, но ничего не меняется,хотя оператор if-else работает. Почему это так?

Я также пытался:

test['Country'] = np.where(test['State'] in us_state_abbrev.values(), "USA", test['Country'])

, но я получаю ValueError: Истинное значение Series является неоднозначным. Используйте a.empty, a.bool (), a.item (), a.any () или a.all (). Почему это так?

1 Ответ

1 голос
/ 05 октября 2019

Не используйте in. Вам нужно isin с np.where

us_state_abbrev = {'Alabama': 'AL', 'Alaska': 'AK', 'IOWA': 'IA', 'Mississippi': 'MI', 'Missouri': 'MO'}

test['Country'] = np.where(test['State'].isin(us_state_abbrev.values()), "USA", test['Country'])

Out[143]:
  State Country
0    MO     USA
1    IA     USA
2    MI     USA
3    AB  Canada
4    ON  Canada
...