转换大熊猫数据框中的分类数据

我有一个包含这种类型数据(太多列)的数据框:

col1        int64
col2        int64
col3        category
col4        category
col5        category

柱子看起来像这样:

Name: col3, dtype: category
Categories (8, object): [B, C, E, G, H, N, S, W]

我想把每列中的所有值都转换成如下的整数:

[1, 2, 3, 4, 5, 6, 7, 8]

我在一篇专栏文章中解决了这个问题:

dataframe['c'] = pandas.Categorical.from_array(dataframe.col3).codes

现在我有两个列在我的数据框架-旧的 col3和新的 c,并需要删除旧的列。

这是个坏习惯。它工作,但在我的数据框中有太多的列,我不想手动这样做。

我怎样才能做得更聪明呢?

264326 次浏览

首先,要将一个分类列转换为它的数字代码,您可以使用: dataframe['c'].cat.codes更容易地完成这项工作。
此外,还可以使用 select_dtypes在数据帧中自动选择具有某种 dtype 的所有列。通过这种方式,可以对多个自动选定的列应用上述操作。

首先制作一个示例数据框架:

In [75]: df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),  'col3':list('ababb')})


In [76]: df['col2'] = df['col2'].astype('category')


In [77]: df['col3'] = df['col3'].astype('category')


In [78]: df.dtypes
Out[78]:
col1       int64
col2    category
col3    category
dtype: object

然后,通过使用 select_dtypes选择列,然后在每个列上应用 .cat.codes,您可以得到以下结果:

In [80]: cat_columns = df.select_dtypes(['category']).columns


In [81]: cat_columns
Out[81]: Index([u'col2', u'col3'], dtype='object')


In [83]: df[cat_columns] = df[cat_columns].apply(lambda x: x.cat.codes)


In [84]: df
Out[84]:
col1  col2  col3
0     1     0     0
1     2     1     1
2     3     2     0
3     4     0     1
4     5     1     1

如果您关心的只是创建一个额外的列并在以后删除它,那么首先不要使用一个新列。

dataframe = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),  'col3':list('ababb')})
dataframe.col3 = pd.Categorical.from_array(dataframe.col3).codes

您已经完成了。现在由于 Categorical.from_array已被废弃,请直接使用 Categorical

dataframe.col3 = pd.Categorical(dataframe.col3).codes

如果您还需要从索引到标签的映射,那么还有更好的方法

dataframe.col3, mapping_index = pd.Series(dataframe.col3).factorize()

检查下面

print(dataframe)
print(mapping_index.get_loc("c"))

@ Quickbeam2k1,见下文-

dataset=pd.read_csv('Data2.csv')
np.set_printoptions(threshold=np.nan)
X = dataset.iloc[:,:].values

用 Sklearnenter image description here

from sklearn.preprocessing import LabelEncoder
labelencoder_X=LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])

这对我有用:

pandas.factorize( ['B', 'C', 'D', 'B'] )[0]

产出:

[0, 1, 2, 0]

这里需要转换多个列。因此,我使用的一种方法是. 。

for col_name in df.columns:
if(df[col_name].dtype == 'object'):
df[col_name]= df[col_name].astype('category')
df[col_name] = df[col_name].cat.codes

这会将所有字符串/对象类型的列转换为分类类型的列,然后对每种类型的类别应用代码。

为了转换数据集 资料C列中的分类数据,我们需要执行以下操作:

from sklearn.preprocessing import LabelEncoder
labelencoder= LabelEncoder() #initializing an object of class LabelEncoder
data['C'] = labelencoder.fit_transform(data['C']) #fitting and transforming the desired categorical column.

对于某个列,如果不关心排序,请使用下面的代码

df['col1_num'] = df['col1'].apply(lambda x: np.where(df['col1'].unique()==x)[0][0])

如果您关心排序,请将它们指定为列表并使用

df['col1_num'] = df['col1'].apply(lambda x: ['first', 'second', 'third'].index(x))

我所做的是,我的 replace值。

像这样

df['col'].replace(to_replace=['category_1', 'category_2', 'category_3'], value=[1, 2, 3], inplace=True)

通过这种方式,如果 col列具有分类值,它们将被数值所替代。

将分类变量转换为虚拟/指示变量的最简单方法之一是使用熊猫提供的 装模作样。 例如,我们有一些数据,其中 sex是一个范畴值(男性和女性) 你需要把它转换成一个虚拟的/指示器这里是如何做到这一点。

tranning_data = pd.read_csv("../titanic/train.csv")
features = ["Age", "Sex", ] //here sex is catagorical value
X_train = pd.get_dummies(tranning_data[features])
print(X_train)


Age Sex_female Sex_male
20    0          1
33    1          0
40    1          0
22    1          0
54    0          1

你可以像下面这样做:

f = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),'col3':list('ababb')})


f['col1'] =f['col1'].astype('category').cat.codes
f['col2'] =f['col2'].astype('category').cat.codes
f['col3'] =f['col3'].astype('category').cat.codes


f

enter image description here

这里的答案似乎已经过时了。熊猫现在有一个 factorize()功能,你可以创建如下分类:

df.col.factorize()

功能签名:

pandas.factorize(values, sort=False, na_sentinel=- 1, size_hint=None)

将数据框中的所有列转换为数字数据:

df2 = df2.apply(lambda x: pd.factorize(x)[0])

你可按以下方式使用 .replace:

df['col3']=df['col3'].replace(['B', 'C', 'E', 'G', 'H', 'N', 'S', 'W'],[1,2,3,4,5,6,7,8])

.map:

df['col3']=df['col3'].map({1: 'B', 2: 'C', 3: 'E', 4:'G', 5:'H', 6:'N', 7:'S', 8:'W'})
categorical_columns =['sex','class','deck','alone']


for column in categorical_columns:
df[column] = pd.factorize(df[column])[0]

Factorize 将一列中每个唯一的分类数据分解为一个特定的数字(从0到无穷大)。

只需使用手动匹配:

dict = {'Non-Travel':0, 'Travel_Rarely':1, 'Travel_Frequently':2}


df['BusinessTravel'] = df['BusinessTravel'].apply(lambda x: dict.get(x))