Панды: замена значений столбцов в фрейме данных


Я пытаюсь заменить значения в одном столбце таблицы данных. Столбец ('женщины') содержит только значения 'женщина' и 'мужчина'.

Я пробовал следующие:

w['female']['female']='1'
w['female']['male']='0' 

но получите точно такую же копию предыдущие результаты.

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

if w['female'] =='female':
    w['female'] = '1';
else:
    w['female'] = '0';

Я посмотрел через документации подводных камней (http://pandas.pydata.org/pandas-docs/stable/gotchas.html), но не может понять, почему ничего не происходит.

любая помощь будет оценили.

9 64

9 ответов:

если я правильно понял, вы хотите что-то вроде этого:

w['female'] = w['female'].map({'female': 1, 'male': 0})

(здесь я преобразую значения в числа вместо строк, содержащих числа. Вы можете конвертировать их в "1" и "0", Если вы действительно хотите, но я не уверен, почему вы хотите этого.)

причина, по которой ваш код не работает, заключается в том, что с помощью ['female'] на колонке (вторая 'female' в своем w['female']['female']) не означает "выбрать строки, где значение 'женщина'". Это означает, чтобы выбрать строки, где индекс является "женским", которого может не быть в вашем фрейме данных.

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

df.loc[<row selection>, <column selection>]

в этом случае:

w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1
w.female.replace(to_replace=dict(female=1, male=0), inplace=True)

посмотреть панды.Фрейм данных.заменить() документы.

небольшое изменение:

w.female.replace(['male', 'female'], [1, 0], inplace=True)

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

w.female[w.female == 'female'] = 1 
w.female[w.female == 'male']   = 0

вы также можете использовать apply С .get т. е.

w['female'] = w['female'].apply({'male':0, 'female':1}.get):

w = pd.DataFrame({'female':['female','male','female']})
print(w)

Dataframe w:

   female
0  female
1    male
2  female

используя apply для замены значений из словаря:

w['female'] = w['female'].apply({'male':0, 'female':1}.get)
print(w)

результат:

   female
0       1
1       0
2       1 

Примечание:apply С помощью словаря следует использовать, если все возможные значения столбцов в фрейме данных определены в словаре else, он будет пустым для тех, кто не определен в словаре.

в качестве альтернативы есть встроенная функция pd.get_dummies для этих видов заданий:

w['female'] = pd.get_dummies(w['female'],drop_first = True)

это дает вам фрейм данных с двумя столбцами, по одному для каждого значения, которое встречается в w['female'], из которого вы отбрасываете первый (потому что вы можете вывести его из того, что осталось). Новый столбец автоматически именуется как строка, которую вы заменили.

это особенно полезно, если у вас есть категориальные переменные с более чем двумя возможными значениями. Этот функция создает столько фиктивных переменных, сколько необходимо для различения всех случаев. Будьте осторожны, тогда вы не назначаете весь фрейм данных одному столбцу, но вместо этого, если w['female'] может быть "мужским", "женским" или "нейтральным", сделайте что-то вроде этого:

w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1])
w.drop('female', axis = 1, inplace = True)

затем вы остаетесь с двумя новыми столбцами, дающими вам фиктивное кодирование "женщины", и вы избавились от столбца со строками.

Это очень компактный:

w['female'][w['female'] == 'female']=1
w['female'][w['female'] == 'male']=0

еще один:

w['female'] = w['female'].replace(regex='female', value=1)
w['female'] = w['female'].replace(regex='male', value=0)

есть также функция в pandas под названием factorize который вы можете использовать для автоматического выполнения этого типа работы. Он преобразует метки в числа:['male', 'female', 'male'] -> [0, 1, 0]. Смотрите этой ответа для получения дополнительной информации.