如何一次热编码来自多个文件的数据
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',所以现在我将使用 [=28 热编码 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 |
--------
我自己也遇到过同样的问题,我解决的方法是将训练集编码后生成的列列表存储在一个列表中,然后在测试集编码后我将按顺序过滤新数据仅保留编码列车集中存在的列。此外,以下函数负责处理训练集中存在但测试集中不存在的可能编码值:
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)
如果您知道预期的级别,请将您的列编码为一个类别。例如:
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
我有两个文件 train.csv 和 test.csv,我正在尝试清理数据集并分别对它们应用特征工程。假设在 train.csv 中我有一个虚拟列,它只包含两种类型的值('A'、'B'),但在 test.csv 中,相同的列包含三种类型的值( 'A','B','C') train.csv 中缺少值 'C',所以现在我将使用 [=28 热编码 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 |
--------
我自己也遇到过同样的问题,我解决的方法是将训练集编码后生成的列列表存储在一个列表中,然后在测试集编码后我将按顺序过滤新数据仅保留编码列车集中存在的列。此外,以下函数负责处理训练集中存在但测试集中不存在的可能编码值:
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)
如果您知道预期的级别,请将您的列编码为一个类别。例如:
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