Подтвердить что ты не робот

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), но не могу понять, почему ничего не происходит.

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

4b9b3361

Ответ 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

Ответ 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 и т.д.