Я бы рекомендовал проверить пакет sqldf Gabor Grothendieck , который позволяет вам выражать эти операции в SQL.
library(sqldf)
## inner join
df3 <- sqldf("SELECT CustomerId, Product, State
FROM df1
JOIN df2 USING(CustomerID)")
## left join (substitute 'right' for right join)
df4 <- sqldf("SELECT CustomerId, Product, State
FROM df1
LEFT JOIN df2 USING(CustomerID)")
Я нахожу синтаксис SQL более простым и более естественным, чем его эквивалент R (но это может просто отражать смещение RDBMS).
Для получения дополнительной информации о объединениях см. Gabor's sqldf GitHub .
Если я правильно понимаю, вы хотите что-то вроде этого:
w['female'] = w['female'].map({'female': 1, 'male': 0})
(Здесь я преобразую значения в числа вместо строк, содержащих числа. Вы можете преобразовать их в "1"
и "0"
, если вы действительно этого хотите, но я не уверен, почему вы этого хотите.)
Причина, по которой ваш код не работает, заключается в том, что с помощью ['female']
в столбце (второй 'female'
в вашем w['female']['female']
) не означает «выбрать строки, где значение« женщина »». Это означает выбор строк, где индекс является «женским», которого в вашем DataFrame не может быть.
Это очень компактно:
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)
В качестве альтернативы есть встроенная функция pd.get_dummies для этих типов назначений:
w['female'] = pd.get_dummies(w['female'],drop_first = True)
Это дает вам фрейм данных с двумя столбцами, по одному для каждого значения, которое встречается в w [gенщина '], из которых вы бросаете первый (потому что вы можете сделать вывод из того, что осталось). Новый столбец автоматически будет называться как строка, которую вы заменили.
Это особенно полезно, если у вас есть категориальные переменные с более чем двумя возможными значениями. Эта функция создает столько фиктивных переменных, сколько необходимо для различения всех случаев. Будьте осторожны, чтобы вы не привязывали весь кадр данных к одному столбцу, но вместо этого, если 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.replace(to_replace=dict(female=1, male=0), inplace=True)
Вы можете отредактировать подмножество фрейма данных с помощью loc:
df.loc[<row selection>, <column selection>]
В этом случае:
w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1
Это также должно работать:
w.female[w.female == 'female'] = 1
w.female[w.female == 'male'] = 0
Существует также функция из pandas
, называемая factorize
, которую вы можете использовать для автоматического выполнения этого типа работы. Он преобразует метки в числа: ['male', 'female', 'male'] -> [0, 1, 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
со словарем следует использовать, если все возможные значения столбцы в dataframe определены в словаре else, они будут пустыми для тех, которые не определены в словаре.
Незначительное изменение:
w.female.replace(['male', 'female'], [1, 0], inplace=True)
.loc
, чтобы избежатьSettingWithCopyWarning
: pandas.pydata.org/pandas-docs/stable/… – NickBraunagel 8 March 2018 в 21:15