繁体   English   中英

如何 OneHot 编码来自多个文件的数据

[英]How can I OneHot Encode data from multiple files

我有两个文件 train.csv 和 test.csv,我正在尝试清理数据集并分别对它们应用特征工程。 假设在 train.csv 中我有一个列虚拟,它只包含两种类型的值('A'、'B'),但在 test.csv 中相同的列包含三种类型的值('A'、'B'、 'C') train.csv 中缺少值 'C',所以现在我将使用 pandas 虚拟方法对 train.csv 进行热编码:

data = pd.get_dummies(data,columns=['dummy'],prefix=['dummy'])

我最终会在训练和测试数据集中有不同数量的列。 此问题出现在多个列中。

train.csv:
-------
|dummy |
--------
|A     |
--------
|B     |
--------
|A     |
--------
|A     |
--------


test.csv:
-------
|dummy |
--------
|A     |
--------
|B     |
--------
|C     |
--------
|A     |
--------

如果您知道预期的级别,请将您的列编码为一个类别。 例如:

traindf = pd.DataFrame({'dummy':['A','B','A','A']})
testdf = pd.DataFrame({'dummy':['A','B','C','A']})

lvls = pd.concat([traindf['dummy'],testdf['dummy']]).unique()

traindf['dummy'] = pd.Categorical(traindf['dummy'],categories=lvls)
testdf['dummy'] = pd.Categorical(testdf['dummy'],categories=lvls)


pd.get_dummies(traindf)
 
   dummy_A  dummy_B  dummy_C
0        1        0        0
1        0        1        0
2        1        0        0
3        1        0        0

pd.get_dummies(testdf)
 
   dummy_A  dummy_B  dummy_C
0        1        0        0
1        0        1        0
2        0        0        1
3        1        0        0

我自己也遇到过同样的问题,我解决它的方法是在将训练集编码到一个列表中后存储生成的列的列表,然后在对测试集进行编码后,我将过滤新数据以仅保留列存在于编码的训练集中。 此外,以下函数处理可能存在于训练集中但不存在于测试集中的编码值:

def encode(X: pd.DataFrame, columns: list = None) -> pd.DataFrame:
    if columns is None:
        columns = []
    encoded_df = pd.get_dummies(X)
    encoded_df = encoded_df.reindex(columns=columns, fill_value=np.uint8(0))
    new_cols = [col for col in list(encoded_df.columns) if col not in columns]
    encoded_df.drop(new_cols, axis=1, inplace=True)
    return encoded_df

您可以通过以下方式使用此功能:

encoded_train_df = encode(train_df)
train_cols = list(encoded_train_df.columns)
encoded_test_df = encode(test_df, columns=train_cols)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM