it-roy-ru.com

Замена значений столбца в pandas DataFrame

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

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

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

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

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

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

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

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

91
Black

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

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

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

Причина, по которой ваш код не работает, заключается в том, что использование ['female'] для столбца (второй 'female' в вашем w['female']['female']) не означает «выбрать строки, в которых значение равно« female »». Это означает, что нужно выбрать строки, в которых index имеет значение «female», которых может не быть в вашем DataFrame.

154
BrenBarn

Вы можете редактировать подмножество данных, используя loc:

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

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

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

Смотрите pandas.DataFrame.replace () документы .

24
jfs

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

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

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

w.female[w.female == 'female'] = 1 
w.female[w.female == 'male']   = 0
14
Nick Crawford

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

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

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

Фрейм данных 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 со словарем следует использовать, если все возможные значения столбцов в кадре данных определены в словаре, иначе он будет пустым для тех, которые не определены в словаре. 

8
student

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

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

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

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

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

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

7
galliwuzz

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

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)
4
Azz

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

1
Roald

Я думаю, что в ответе должно быть указано, какой тип объекта вы получаете во всех методах, предложенных выше: это Series или DataFrame.

Когда вы получите столбец с помощью w.female. или w[[2]] (где, предположим, 2 - номер вашего столбца), вы получите DataFrame . Таким образом, в этом случае вы можете использовать методы DataFrame, такие как .replace.

Когда вы используете .loc или iloc, вы получаете обратно Series, а Series не имеют метода .replace, поэтому вам следует использовать такие методы, как apply, map и так далее.

0
Alex-droid AD