Как изменить значения в определенных строках в зависимости от заданного условия в пандах? - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу сделать что-то вроде этого:

for row in df:
if row['Country'] == 'unknown':
    row['Country'] = city2country_mapping[row['city']]

Страна и город - это столбцы.

'city2country_mapping' - это словарь, в котором пара ключ: значение 'city': 'country'.

(в основном я пытаюсь заполнить неизвестные, получая страну из словаря, поскольку я знаю город для каждой строки)

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Вы можете сделать это, используя apply:

df['Country'] = df.apply(lambda row: city2country_mapping[row['city']] 
                                     if row['Country'] == 'unknown' else row['Country'], axis=1)

Лямбда возвращает город из сопоставления в случае «неизвестной» страны и в противном случае просто страны в этом ряду.

0 голосов
/ 12 декабря 2018

Редактирование определенных строк: DataFrame.loc против Series.where

Стандартная опция для редактирования определенных строк ("срез") объекта DataFrame - .loc.

В принятом ответе используется аккуратное приложение pandas.Series.where для перезаписи серии df.Country, что более кратко для этой конкретной задачи.

Значения записи: .apply против .map

Вы можете использовать .map(), чтобы перекодировать серию напрямую со словарем - не нужно .apply() лямбда-функция.

Пример

# Example data
df = pd.DataFrame({'Country': ['unknown', 'USA', 'unknown', 'UK', 'USA', 'unknown'],
                   'City': ['London', 'New York', 'New York', 'London', 'New York', 'Paris']
                  })
city2country_mapping = {'London': 'UK', 'New York': 'USA', 'Paris': 'France'}

# print(df)

#    Country      City
# 0  unknown    London
# 1      USA  New York
# 2  unknown  New York
# 3       UK    London
# 4      USA  New York
# 5  unknown     Paris

df.loc[df.Country == 'unknown', 'Country'] = df[df.Country == 'unknown'].City.map(city2country_mapping)
print(df)

Выход:

  Country      City
0      UK    London
1     USA  New York
2     USA  New York
3      UK    London
4     USA  New York
5  France     Paris
0 голосов
/ 12 декабря 2018

Вы можете векторизовать это с помощью pandas.Series.where:

df['country'] = df.country.where(
    df.country != 'unknown', df.city.map(city2country_mapping))

df.city.map(city2country_mapping) сначала создаст Серию, содержащую соответствующую страну для каждого города, а затем использует ее для заменыunknown стран в столбце country.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...