Есть ли простой способ изменить столбец да / нет на 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
Вы можете преобразовать ряд из 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']]