Если в столбце есть слово, создайте новый столбец с найденным значением. - PullRequest
1 голос
/ 06 июня 2019

Я пытаюсь очистить мою переменную df ['Country'], создав новую переменную df ['Country Clean'], которая принимает значение переменной страны, если находит ее в столбце df ['Country'].

Я понял, что, если я повторю свою команду, я также удалю свои предыдущие результаты и получу только переменную, сообщающую результаты для 'Россия'

Есть ли способ сделать это?

data = {'Number':['1', '2', '1', '2', '1', '2'], 'Country':['Italy 1', 'Italie', 'Ecco', 'Russia is in Euroasia' ,  'Yugoslavia', 'Russia']}
df = pd.DataFrame(data) 
df['Country Clean'] = df['Country'].str.replace(r'(^.*Italy.*$)', 'Italy')
df['Country Clean']  = df['Country'].str.replace(r'(^.*Russia.*$)', 'Russia')

Ожидаемый результат

data2 = {'Number':['1', '2', '1', '2', '1', '2'], 'Country':['Italy', 'Italy', NaN, 'Russia' , NaN , 'Russia']}
exp = pd.DataFrame(data2) 
exp

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Я предлагаю сначала нормализовать названия стран, а затем изменить значения столбца Чистота страны в соответствии со списком разрешенных стран:

normalize_countries={"Italie": "Italy", "Rusia": "Russia"}    # Spelling corrections
pattern = r"\b(?:{})\b".format("|".join(normalize_countries)) # Regex to find misspellings

countries = ["Italy", "Russia"]                               # Country list
df['Country Clean'] = df['Country'].str.replace(pattern, lambda x: normalize_countries[x.group()])
def applyFunc(s):  
    for e in countries:
        if e in s:
            return e
    return 'NaN'

df['Country Clean'] = df['Country Clean'].apply(applyFunc)

Вывод:

>>> df
  Number                Country Country Clean
0      1                Italy 1         Italy
1      2                 Italie         Italy
2      1                   Ecco           NaN
3      2  Russia is in Euroasia        Russia
4      1             Yugoslavia           NaN
5      2                 Russia        Russia

Строка df['Country'].str.replace(pattern, lambda x: normalize_countries[x.group()])выполняет поиск всех названий стран с ошибками как целых слов в столбце Country и заменяет их правильными вариантами написания.

Вы также можете добавить проверку целого слова при поиске стран, если в списке countries используете регулярные выраженияи затем используйте re.search вместо if e in countries в applyFunc.

1 голос
/ 06 июня 2019

Использование:

In [15]: countries = ["italy", "russia", "yugoslavia", "italie"]

In [16]: for i in countries:df.loc[lambda x:x.Country.str.lower().str.contains(i), 'Country Clean'] = i.capitalize()

In [17]: df
Out[17]:
  Number                Country Country Clean
0      1                Italy 1         Italy
1      2                 Italie        Italie
2      1                   Ecco           NaN
3      2  Russia is in Euroasia        Russia
4      1             Yugoslavia    Yugoslavia
5      2                 Russia        Russia
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...