批量转换Pandas中的分类列(不是一键编码)


12

我有带有大量分类列的pandas数据框,我打算在scikit-learn的决策树中使用它。我需要将它们转换为数值(不是一个热向量)。我可以使用scikit-learn的LabelEncoder做到这一点。问题是它们太多了,我不想手动转换它们。

什么是使该过程自动化的简单方法。


熊猫中的get_dummies函数可以为您提供帮助。在此处查看文档以了解更多详细信息。我认为它很好地涵盖了该用例,您可以通过提供自定义前缀来进一步调整行为。
hssay

Answers:


11

如果您的分类列当前是字符/对象,则可以使用类似的方法来做每一件事:

char_cols = df.dtypes.pipe(lambda x: x[x == 'object']).index

for c in char_cols:
    df[c] = pd.factorize(df[c])[0]

如果您需要返回类别,我将创建一个字典来保存编码;就像是:

char_cols = df.dtypes.pipe(lambda x: x[x == 'object']).index
label_mapping = {}

for c in char_cols:
    df[c], label_mapping[c] = pd.factorize(df[c])

使用Julien的mcve将输出:

In [3]: print(df)
Out[3]: 
    a   b   c   d
0   0   0   0   0.155463
1   1   1   1   0.496427
2   0   0   2   0.168625
3   2   0   1   0.209681
4   0   2   1   0.661857

In [4]: print(label_mapping)
Out[4]:
{'a': Index(['Var2', 'Var3', 'Var1'], dtype='object'),
 'b': Index(['Var2', 'Var1', 'Var3'], dtype='object'),
 'c': Index(['Var3', 'Var2', 'Var1'], dtype='object')}

查找object列的代码非常有用。
javadba

6

首先,让我们创建一个mcve来玩:

import pandas as pd
import numpy as np

In [1]: categorical_array = np.random.choice(['Var1','Var2','Var3'],
                                             size=(5,3), p=[0.25,0.5,0.25])
        df = pd.DataFrame(categorical_array,
               columns=map(lambda x:chr(97+x), range(categorical_array.shape[1])))
        # Add another column that isn't categorical but float
        df['d'] = np.random.rand(len(df))
        print(df)

Out[1]:
      a     b     c         d
0  Var3  Var3  Var3  0.953153
1  Var1  Var2  Var1  0.924896
2  Var2  Var2  Var2  0.273205
3  Var2  Var1  Var3  0.459676
4  Var2  Var1  Var1  0.114358

现在我们可以使用pd.get_dummies编码前三列。

请注意,我使用该drop_first参数是因为N-1虚拟变量足以完全描述N可能性(例如:如果a_Var2and a_Var3为0,则为a_Var1)。另外,我专门指定了列,但我不必这样做,因为它将是dtype objectcategorical(更多内容见下文)。

In [2]: df_encoded = pd.get_dummies(df, columns=['a','b', 'c'], drop_first=True)
        print(df_encoded]
Out[2]:
          d  a_Var2  a_Var3  b_Var2  b_Var3  c_Var2  c_Var3
0  0.953153       0       1       0       1       0       1
1  0.924896       0       0       1       0       0       0
2  0.273205       1       0       1       0       1       0
3  0.459676       1       0       0       0       0       1
4  0.114358       1       0       0       0       0       0

在您的特定应用程序中,您将必须提供一个列为“分类”的列表,或者您必须推断哪些列为“分类”。

最好的情况是您的数据框已经包含带有a的列,dtype=category您可以将其传递columns=df.columns[df.dtypes == 'category']get_dummies

否则,我建议dtype适当设置所有其他列的(提示:pd.to_numeric,pd.to_datetime等),您将剩下带有dtype的列,object这些列应该是您的分类列。

pd.get_dummies参数列的默认值如下:

columns : list-like, default None
    Column names in the DataFrame to be encoded.
    If `columns` is None then all the columns with
    `object` or `category` dtype will be converted.

2

为了一次转换多个列的类型,我将使用如下代码:

df2 = df.select_dtypes(include = ['type_of_insterest'])

df2[df2.columns].apply(lambda x:x.astype('category'))

然后我会加入他们的行列original df


我想df2[df2.columns] = df2[df2.columns].astype('category')也一样,不apply,不lambda
paulperry
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.