Pandas: замена значений столбцов в фрейме данных
Я пытаюсь заменить значения в одном столбце фрейма данных. В столбце ( "женщина" ) содержатся только слова "женщина" и "мужчина".
Я пробовал следующее:
w['female']['female']='1'
w['female']['male']='0'
Но получите ту же самую копию предыдущих результатов.
В идеале я хотел бы получить некоторый вывод, похожий на следующий элемент цикла.
if w['female'] =='female':
w['female'] = '1';
else:
w['female'] = '0';
Я просмотрел документацию gotchas (http://pandas.pydata.org/pandas-docs/stable/gotchas.html), но не могу понять, почему ничего не происходит.
Любая помощь будет оценена.
Ответы
Ответ 1
Если я правильно понимаю, вы хотите что-то вроде этого:
w['female'] = w['female'].map({'female': 1, 'male': 0})
(Здесь я преобразовываю значения в числа вместо строк, содержащих числа. Их можно преобразовать в "1"
и "0"
, если вы действительно этого хотите, но я не уверен, зачем вам это нужно.)
Причина, по которой ваш код не работает, заключается в том, что использование ['female']
в столбце (второй 'female'
в вашем w['female']['female']
) не означает "выбирать строки, где значение" женщина ". Это означает выбор строк, где индекс является" женским", которого не может быть в вашем DataFrame.
Ответ 2
Вы можете отредактировать подмножество фрейма данных с помощью loc:
df.loc[<row selection>, <column selection>]
В этом случае:
w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1
Ответ 3
w.female.replace(to_replace=dict(female=1, male=0), inplace=True)
Смотрите pandas.DataFrame.replace() docs.
Ответ 4
Незначительное изменение:
w.female.replace(['male', 'female'], [1, 0], inplace=True)
Ответ 5
Это также должно работать:
w.female[w.female == 'female'] = 1
w.female[w.female == 'male'] = 0
Ответ 6
Вы также можете использовать apply
с .get
ie
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, оно будет пустым для тех, которые не определены в словаре.
Ответ 7
В качестве альтернативы для этих видов назначений есть встроенная функция 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)
Затем вы остаетесь с двумя новыми столбцами, давая вам фиктивное кодирование "женский", и вы избавились от столбца со строками.
Ответ 8
Это очень компактно:
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)
Ответ 9
В pandas
есть функция factorize
, которую вы можете использовать для автоматического выполнения этого типа работы. Он преобразует метки в числа: ['male', 'female', 'male'] -> [0, 1, 0]
. Подробнее см. .
Ответ 10
Я думаю, что в ответ следует указать, какой тип объекта вы используете во всех предложенных выше методах: это серия или DataFrame.
Когда вы получите столбец w.female.
или w[[2]]
(где, предположим, 2 - номер вашей колонки), вы вернете DataFrame. Таким образом, в этом случае вы можете использовать методы .replace
такие как .replace
.
Когда вы используете .loc
или iloc
вы возвращаетесь к Серии, а Series не имеют метода .replace
, поэтому вы должны использовать такие методы, как apply
, map
и т.д.