LabelEncoder 将缺失值保留为“NaN”

2023-11-21

我正在尝试使用标签编码器将分类数据转换为数值。

我需要一个 LabelEncoder 将缺失值保留为“NaN”,以便之后使用 Imputer。所以我想在像这样标记后使用掩码来替换原始数据框

df = pd.DataFrame({'A': ['x', np.NaN, 'z'], 'B': [1, 6, 9], 'C': [2, 1, np.NaN]})


    A   B   C
0   x   1   2.0
1   NaN 6   1.0
2   z   9   NaN


dfTmp = df
mask = dfTmp.isnull()

       A    B   C
0   False   False   False
1   True    False   False
2   False   False   True

所以我得到一个具有真/假值的数据框

然后,创建编码器:

df = df.astype(str).apply(LabelEncoder().fit_transform)

那么我该如何继续,以便对这些值进行编码?

thanks


第一个问题是:您希望单独对每一列进行编码还是使用一种编码对所有列进行编码?

表达方式df = df.astype(str).apply(LabelEncoder().fit_transform)意味着您单独对所有列进行编码。

That case you can do the following:
df = df.apply(lambda series: pd.Series(
    LabelEncoder().fit_transform(series[series.notnull()]),
    index=series[series.notnull()].index
))
print(df)
Out:
     A  B    C
0  0.0  0  1.0
1  NaN  1  0.0
2  1.0  2  NaN

下面解释它是如何工作的。但是,首先,我将介绍该解决方案的一些缺点。

缺点
首先,存在混合类型的列:如果列包含NaN值,那么列有一个类型float,因为 nan 是 python 中的浮点数。

df.dtypes
A    float64
B      int64
C    float64
dtype: object

对于标签来说似乎毫无意义。好的,稍后您可以忽略所有 nan,并将其余部分转换为整数。

第二点是:可能你需要记住一个LabelEncoder- 因为通常需要进行逆变换等操作。但是这个解决方案不记住编码器,你没有这样的变量。

一个简单、明确的解决方案是:

encoders = dict()

for col_name in df.columns:
    series = df[col_name]
    label_encoder = LabelEncoder()
    df[col_name] = pd.Series(
        label_encoder.fit_transform(series[series.notnull()]),
        index=series[series.notnull()].index
    )
    encoders[col_name] = label_encoder

print(df)
Out:
     A  B    C
0  0.0  0  1.0
1  NaN  1  0.0
2  1.0  2  NaN

- 更多代码,但结果是相同的

print(encoders)
Out
{'A': LabelEncoder(), 'B': LabelEncoder(), 'C': LabelEncoder()}

- 此外,还可以使用编码器。逆变换(也应该删除之前的 nan!):

encoders['B'].inverse_transform(df['B'])
Out:
array([1, 6, 9])

此外,一些选项(例如编码器的某些注册表超类)也可用,它们与第一个解决方案兼容,但更容易迭代列。

怎么运行的

The df.apply(lambda series: ...)应用一个返回的函数pd.Series到每一列;因此,它返回一个包含新值的数据帧。

逐步表达:

pd.Series(
    LabelEncoder().fit_transform(series[series.notnull()]),
    index=series[series.notnull()].index
)

- series[series.notnull()] drop NaN值,然后将其余的输入到fit_transform.

- 当标签编码器返回一个numpy.array并抛出一个索引,index=series[series.notnull()].index恢复它以正确连接它。如果不做索引:

print(df)
Out:
     A  B    C
0    x  1  2.0
1  NaN  6  1.0
2    z  9  NaN
df = df.apply(lambda series: pd.Series(
    LabelEncoder().fit_transform(series[series.notnull()]),
))
print(df)
Out:
     A  B    C
0  0.0  0  1.0
1  1.0  1  0.0
2  NaN  2  NaN

- 价值观从正确的位置转移 - 甚至IndexError可能发生。

所有列均采用单一编码器

在这种情况下,堆栈数据帧,适合编码器,然后取消堆栈

series_stack = df.stack().astype(str)
label_encoder = LabelEncoder()
df = pd.Series(
    label_encoder.fit_transform(series_stack),
    index=series_stack.index
).unstack()
print(df)
Out:
     A    B    C
0  5.0  0.0  2.0
1  NaN  3.0  1.0
2  6.0  4.0  NaN

- 作为series_stack is pd.Series含有NaN的,DataFrame 中的所有值都是浮点数,因此您可能更愿意对其进行转换。

希望能帮助到你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LabelEncoder 将缺失值保留为“NaN” 的相关文章

随机推荐

  • 混淆或保护 .Net 程序集的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在寻找一种技术或工具 我们可以用它来混淆或以某种方式保护我们编译的 C 代码 目标不是为了用户 数据安全 而是阻碍我们软件中某些技术的逆向工程 这不适用于网络 而是用于桌面应用程
  • 可以阻止 cin 等待输入吗?

    在图形应用程序中 我使用控制台输入执行调试命令 创建控制台时 还会创建一个新线程来收集处理所有输入的用户命令 图形应用程序将继续并行运行 我使用 boost thread 库 到目前为止效果很好 但是我还没有找到一个很好的解决方案来停止该线
  • 使用 imagerotate() 旋转图像后如何获得新的宽度和高度?

    如何实际获取图像旋转后设置的新宽度和高度 ps product angle 77 Could be any angle filename test png filename to the original product list sour
  • 如何在 Django 视图中最好地启动异步作业请求?

    我的视图功能之一是一个非常长的处理工作 显然需要以不同的方式处理 最好不要让用户等待很长时间 最好是我能够午餐处理处理作业 该处理作业将通过电子邮件发送结果 并且无需等待完成即可通知用户他们的请求正在处理并让他们继续浏览 我知道我可以使用
  • C++中的函数指针赋值和调用?

    我知道当我们使用函数名称作为值时 该函数会自动转换为指针 看下面的代码 int print int a return a int main int p int print int q int print cout lt lt p 8 lt
  • PHP 正则表达式验证字母和西班牙口音

    我如何添加 临时修改我的代码 以便除了正常字母表 a z 之外 西班牙口音也被视为有效 我的代码中有以下内容 public static function IsAlpha s reg a z s i count preg match reg
  • 在Python中删除字符串中间的连续字符[重复]

    这个问题在这里已经有答案了 从字节转换为字符串后 Google 地图 API 的标准返回值如下所示 b n destination addresses Washington DC USA n origin addresses New Yor
  • 在 java (JSP) 中提取 .tar.gz 文件

    我似乎无法导入所需的包或找到任何有关如何提取的在线示例 tar gzjava 中的文件 更糟糕的是我正在使用 JSP 页面 并且在将包导入到我的项目中时遇到问题 我正在将 jar 复制到WebContent WEB INF lib 然后右键
  • Typescript 方法装饰器

    我有这个代码 function changeFunc return function target any title string descriptor PropertyDescriptor descriptor value functi
  • Python 不向多个地址发送电子邮件

    我看不出我哪里出了问题 我希望有人能发现这个问题 我想向多个地址发送电子邮件 但是 它仅将其发送到列表中的第一个电子邮件地址 而不是同时发送到两者 这是代码 import smtplib from smtplib import SMTP r
  • 检测用户所做的屏幕分辨率更改(Java Listener?)

    我有一个 Java 应用程序 可以启动 创建 GUI 并且运行良好 如果用户更改屏幕分辨率 从 1440x900 切换到 1280x768 我希望能够侦听该事件 有任何想法吗 PS 我想在事件 侦听器模式下执行此操作 而不是在轮询模式下执行
  • sbt-assemble 包括测试类

    我跟随sbt assemble 包括测试类来自中描述的配置https github com sbt sbt assemble组装工作正常 当我加载 sbt 时我得到 assembly sbt 5 error reference to jar
  • 卸载动态库需要两次 dlclose() 调用?

    我有一个动态库 我使用它加载dlopen 然后使用卸载dlclose 如果我不包含任何目标 C 代码dlopen 需要一个dlclose 调用这是预期的行为 但是当我包含任何目标 c 代码作为目标时 我遇到的问题是我需要做两件事dlclos
  • 无法在 Eclipse 中创建新的 FXML 文件

    当我尝试在 Eclipse 中创建一个新的 FXML 文件 文件 gt 新建 gt 其他 gt JavaFX 新的 FXML 文档 gt 下一步 时 什么也没有发生 它不创建文件 当我尝试创建 FXGraph 或 JavaFX HTML 模
  • 使用.NET Core从Azure表存储中检索前n条记录

    是否可以使用 C 从 Azure 表存储中检索前 n 条记录 我正在使用 NET Core 如果我也能得到一些参考资料那就太好了 请注意 我的所有实体都是使用 Log Tail 模式存储的https learn microsoft com
  • 我使用了 matplotlib,但图形中出现了错误消息“

    import matplotlib pyplot as plt from matplotlib import font manager rc f name font manager FontProperties fname C Window
  • C++中map的初值假设

    我正在初始化地图map
  • Pandas/Numpy NaN 无比较

    Python Pandas 和 Numpy 中 为什么比较结果不同 from pandas import Series from numpy import NaN NaN不等于NaN gt gt gt NaN NaN False but N
  • 如何将我的 Node.js 客户端连接限制为 2 个?

    我基本上试图只允许 2 个客户端同时连接到该应用程序 我应该如何处理这个问题 这是我的服务器代码 var express require express app express server require http createServe
  • LabelEncoder 将缺失值保留为“NaN”

    我正在尝试使用标签编码器将分类数据转换为数值 我需要一个 LabelEncoder 将缺失值保留为 NaN 以便之后使用 Imputer 所以我想在像这样标记后使用掩码来替换原始数据框 df pd DataFrame A x np NaN