有没有一种简单的方法可以在Pandas数据帧中将yes / no列更改为1/0?

时间:2016-12-01 02:43:26

标签: python pandas dataframe series

我将csv文件读入pandas数据帧,并希望将带有二进制答案的列从yes / no字符串转换为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 个答案:

答案 0 :(得分:38)

方法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

<强> 定时
给出样本

enter image description here

<强> 定时
长样品
sample = pd.DataFrame(dict(housing=np.random.choice(('yes', 'no'), size=100000)))

enter image description here

答案 1 :(得分:6)

试试这个:

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

答案 2 :(得分:6)

# 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)

答案 3 :(得分:3)

是,您可以使用以下代码段将列的是/否值更改为1/0

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

通过使用第一行,您可以将值替换为1/0 通过使用第二行,您可以通过打印看到更改

答案 4 :(得分:2)

%timeit
sampleDF['housing'] = sampleDF['housing'].apply(lambda x: 0 if x=='no' else 1)

1.84 ms±56.2μs/循环(平均值±标准偏差,7次运行,每次1000次循环)

  
    
      

将“是”替换为1,将“否”替换为指定的df列为0。

    
  

答案 5 :(得分:2)

通用方式:

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

答案 6 :(得分:1)

您可以将一系列从布尔值明确转换为整数:

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

答案 7 :(得分:1)

使用sklearn的LabelEncoder

from sklearn.preprocessing import LabelEncoder

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

Source

答案 8 :(得分:0)

对于一个名为 data 的数据集和一个名为 Paid 的列;

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

所有的 yes 将变为 1,所有的 no 将替换为 0

答案 9 :(得分:0)

理解数组

sampleDF['housing'] = [int(v == 'yes') for v in sampleDF['housing']]

答案 10 :(得分:0)

使用pandas.Series.map

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

答案 11 :(得分:0)

尝试一下,它将起作用。

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

答案 12 :(得分:0)

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

这将起作用。

答案 13 :(得分:0)

这只是对int的滥用。

尝试一下。

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

答案 14 :(得分:0)

您也可以尝试:

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

答案 15 :(得分:0)

我使用了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))

希望我对此做了清楚的解释。

答案 16 :(得分:0)

将整个数据帧转换为0和1的简单直观的方法可能是:

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

答案 17 :(得分:0)

使用熊猫的简单方法如下:

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

从主df删除此文件

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

现在在您的df中合并一个新的

sampleDF= pd.concat([sampleDF,housing ],axis=1)

答案 18 :(得分:0)

尝试以下操作:

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