【问题标题】:Python using apply function to skip NanPython使用apply函数跳过Nan
【发布时间】: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


    【解决方案1】:

    我想我想出了一个解决方法。我可能应该从一开始就使用 sklearn 的 OneHotEncoder 类,而不是 LabelEncoder/defaultdict 组合。我对这一切都是全新的。我用虚拟值替换了 NaN,然后​​在对数据帧进行编码后删除了这些虚拟值。

    import pandas as pd
    from sklearn.preprocessing import OneHotEncoder
    
    df = pd.DataFrame(data = {'col1': ['A', 'B','C',None,'A'], 'col2': ['Z', 'X',None,'Z','Y'], 'col3':['I','J',None,'J','J'], 'col4':[45,67,None,32,94]})
    
    replaceVals = {'col1':'missing','col2':'missing','col3':'missing','col4':-1}
    df = df.fillna(value = replaceVals,axis=0)
    
    drop = [['missing'],['missing'],['missing'],[-1]]
    enc = OneHotEncoder(drop=drop)
    encodeDF = enc.fit_transform(df)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 2012-10-13
      • 2018-05-28
      • 2018-12-05
      • 1970-01-01
      • 2022-01-11
      • 2022-08-18
      相关资源
      最近更新 更多