【发布时间】:2020-05-13 10:59:07
【问题描述】:
我正在尝试通过将每列中的类映射到数值来预处理要用于 XGBoost 的数据集。一个工作示例如下所示:
from collections import defaultdict
from sklearn.preprocessing import LabelEncoder
import pandas as pd
df1 = pd.DataFrame(data = {'col1': ['A', 'B','C','B','A'], 'col2': ['Z', 'X','Z','Z','Y'], 'col3':['I','J','I','J','J']})
d = defaultdict(LabelEncoder)
encodedDF = df1.apply(lambda x: d[x.name].fit_transform(x))
inv = encodedDF.apply(lambda x: d[x.name].inverse_transform(x))
codedDF 给出输出的地方:
col1 col2 col3
0 2 0
1 0 1
2 2 0
1 2 1
0 1 1
并且 inv 只是将其恢复为原始数据帧。我的问题是何时引入空值:
df2 = pd.DataFrame(data = {'col1': ['A', 'B',None,'B','A'], 'col2': ['Z', 'X','Z',None,'Y'], 'col3':['I','J','I','J','J']})
encodedDF = df2.apply(lambda x: d[x.name].fit_transform(x))
运行上面会抛出错误:
"TypeError: ('argument must be a string or number', 'occured at index col1')"
基本上,我想应用编码,但跳过为空的单个单元格值以获得如下输出:
col1 col2 col3
0 2 0
1 0 1
NaN 2 0
1 NaN 1
0 1 1
在应用编码之前我不能使用 dropna(),因为这样我会丢失我将尝试使用 XGBoost 估算的数据。如果为 null,我不能使用条件来跳过 x(例如,在 lambda 函数中使用 x.notnull()),因为 fit_transform(x) 使用 Pandas.Series 对象作为参数,并且没有我可以使用的逻辑运算符在有条件的似乎做我想做的事情。我不确定要尝试什么才能使其正常工作。我希望我正在尝试做的事情是有意义的。如果我需要澄清,请告诉我。
【问题讨论】:
标签: python-3.x machine-learning scikit-learn apply nan