Как сопоставить целочисленный столбец с текстовыми значениями в pandas [duplicate]

Я бы рекомендовал проверить пакет 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 .

61
задан Black 26 April 2014 в 07:04
поделиться

9 ответов

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

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

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

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

120
ответ дан BrenBarn 21 August 2018 в 18:36
поделиться
  • 1
    Благодарю. Именно то, что я искал. Если бы я должен был отобразить «женский» на 1 и все остальное на «0». Как это будет работать? – Black 26 April 2014 в 08:47
  • 2
    используйте это только, если все значения в столбце указаны в функции карты. Значения столбца, не указанные в функции карты, будут заменены нан. – Chandra 22 March 2017 в 19:56
  • 3
    Я также рекомендовал бы использовать синтаксис .loc, чтобы избежать SettingWithCopyWarning: pandas.pydata.org/pandas-docs/stable/… – NickBraunagel 8 March 2018 в 21:15

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

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)
1
ответ дан Azz 21 August 2018 в 18:36
поделиться
  • 1
    Первый пример - это цепочечная индексация и предупреждается об этом, поскольку он не может гарантировать, является ли результирующий df копией или представлением. См. прикованное индексирование – Nordle 24 July 2018 в 11:00

В качестве альтернативы есть встроенная функция 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)

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

5
ответ дан galliwuzz 21 August 2018 в 18:36
поделиться
w.female.replace(to_replace=dict(female=1, male=0), inplace=True)

См. pandas.DataFrame.replace () docs .

19
ответ дан jfs 21 August 2018 в 18:36
поделиться

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

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

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

w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1
68
ответ дан Jimmy Petersson 21 August 2018 в 18:36
поделиться
  • 1
    Как бы я его адаптировал, поэтому мне не нужно выбирать определенные строки через условие, только все строки в определенном столбце? Поэтому измените все ячейки в столбце на определенное значение. – Dhruv Ghulati 8 September 2016 в 15:20
  • 2
    @DhruvGhulati, вы бы использовали df.loc [:, & lt; column selection & gt;] – user 19 December 2016 в 00:41

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

w.female[w.female == 'female'] = 1 
w.female[w.female == 'male']   = 0
11
ответ дан Nick Crawford 21 August 2018 в 18:36
поделиться
  • 1
    Большое спасибо ... это помогло мне в моей другой проблеме. – SPy 27 May 2018 в 05:31

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

1
ответ дан Roald 21 August 2018 в 18:36
поделиться

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

5
ответ дан student 21 August 2018 в 18:36
поделиться

Незначительное изменение:

w.female.replace(['male', 'female'], [1, 0], inplace=True)
16
ответ дан user5878756 21 August 2018 в 18:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: