Есть ли простой способ изменить столбец да / нет на 1/0 в кадре данных Pandas?

Я прочитал csv-файл в фрейм данных pandas и хотел бы преобразовать столбцы с двоичными ответами из строк да / нет в целые числа 1/0. Ниже я показываю один из таких столбцов ("sampleDF" - это кадр данных pandas).

In [13]: sampleDF.housing[0:10]
Out[13]:
0     no
1     no
2    yes
3     no
4     no
5     no
6     no
7     no
8    yes
9    yes
Name: housing, dtype: object

Помощь очень ценится!

19 ответов

способ 1

sample.housing.eq('yes').mul(1)

способ 2

pd.Series(np.where(sample.housing.values == 'yes', 1, 0),
          sample.index)

метод 3

sample.housing.map(dict(yes=1, no=0))

метод 4

pd.Series(map(lambda x: dict(yes=1, no=0)[x],
              sample.housing.values.tolist()), sample.index)

метод 5

pd.Series(np.searchsorted(['no', 'yes'], sample.housing.values), sample.index)

Все дают

0    0
1    0
2    1
3    0
4    0
5    0
6    0
7    0
8    1
9    1

синхронизация
данный образец

введите описание изображения здесь

синхронизация
длинный образец
sample = pd.DataFrame(dict(housing=np.random.choice(('yes', 'no'), size=100000)))

введите описание изображения здесь

Попробуй это:

sampleDF['housing'] = sampleDF['housing'].map({'yes': 1, 'no': 0})
# produces True/False
sampleDF['housing'] = sampleDF['housing'] == 'yes'

Выше приведены значения True/False, которые по существу равны 1/0 соответственно. Булевы значения поддерживают функции суммирования и т. Д. Если вам действительно нужно, чтобы значения были 1/0, вы можете использовать следующее.

housing_map = {'yes': 1, 'no': 0}
sampleDF['housing'] = sampleDF['housing'].map(housing_map)
%timeit
sampleDF['housing'] = sampleDF['housing'].apply(lambda x: 0 if x=='no' else 1)

1,84 мс ± 56,2 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, 1000 циклов в каждом)

Заменяет "да" на 1, "нет" на 0 для указанного столбца df.

Использовать sklearn's LabelEncoder

from sklearn.preprocessing import LabelEncoder

lb = LabelEncoder() 
sampleDF['housing'] = lb.fit_transform(sampleDF['housing'])

Источник

Да , вы можете изменить значения да / нет своего столбца на 1/0, используя следующий фрагмент кода

sampleDF = sampleDF.replace(to_replace = ['yes','no'],value = ['1','0'])
sampleDF

используя первую строку, вы можете заменить значения на 1/0, используя вторую строку, вы можете увидеть изменения, распечатав ее

Для набора данных имена данных и столбца с именем Paid;

      data = data.replace({'Paid': {'yes': 1, 'no': 0}})

все yes изменится на 1 и все no будет заменен на 0

Общий способ:

import pandas as pd
string_data = string_data.astype('category')
numbers_data = string_data.cat.codes

ссылка: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.astype.html

Используйте pandas.Series.map

sampleDF.map({'yes':1,'no':0})

Вы можете преобразовать ряд из Boolean в целое число явно:

sampleDF['housing'] = sampleDF['housing'].eq('yes').astype(int)

Простой и интуитивно понятный способ преобразовать весь массив данных в 0 и 1 может быть:

sampleDF = sampleDF.replace(to_replace = "yes", value = 1)
sampleDF = sampleDF.replace(to_replace = "no", value = 0)

Попробуйте, это сработает.

sampleDF.housing.replace(['no', 'yes'], [0,1], inplace = True) 

Самый простой способ сделать это - использовать панд, как показано ниже:

housing = pd.get_dummies(sampleDF['housing'],drop_first=True)

после этого удалите это поле из основного d f

sampleDF.drop('housing',axis=1,inplace=True)

Теперь слить новый в вас DF

sampleDF= pd.concat([sampleDF,housing ],axis=1)
sampleDF['housing'] = sampleDF['housing'].map(lambda x: 1 if x == 'yes' else 0)
sampleDF['housing'] = sampleDF['housing'].astype(int)

Это сработает.

Я использовал функцию предварительной обработки из sklearn. Сначала вы создаете кодировщик.

e = preprocessing.LabelEncoder()

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

size = le.fit_transform(list(data["size"]))
color = le.fit_transform(list(data["color"]))

Он преобразует список всех атрибутов "размер" или "цвет" и преобразует его в список их соответствующих целочисленных значений. Чтобы собрать все это в один список, используйте функцию zip.

Он не будет в том же формате, что и файл csv; это будет гигантский список всего.

data = list(zip(buying, size))

Надеюсь, я объяснил это достаточно ясно.

Вы также можете попробовать:

sampleDF["housing"] = (sampleDF["housing"]=="Yes")*1 

Это просто логическое значение для int.

Попробуй это.

sampleDF.housing = (sampleDF.housing == 'yes').astype(int)

Попробуйте следующее:

sampleDF['housing'] = sampleDF['housing'].str.lower().replace({'yes': 1, 'no': 0})

массив понимания

      sampleDF['housing'] = [int(v == 'yes') for v in sampleDF['housing']]
Другие вопросы по тегам