【发布时间】:2020-03-12 20:01:14
【问题描述】:
这是一个奇怪的问题。我没有可能制作 MVE。
我在 pandas 中有两个数据集。它们包含一些系列,可以具有三个值:“是”、“否”、NaN。这些系列此时有 Dtype 对象。
我想从它们中删除 NaN,并准备它们以供 ML 算法使用,所以我这样做:
final_df1 = d1.dropna(how='any').replace({"Yes":1, "No":0})
final_df2 = d2.dropna(how='any').replace({"Yes":1, "No":0})
在final_df1 中,我之前提到的系列的Dtype 在删除NaN 值并替换值后自动变为int64。在final_df2 中,这不会发生。它们包含相同的值(0 和 1),所以我真的不明白。
为了创建一个最小可行示例,我尝试了
- 隔离系列,对它们一一进行转换并检查结果
- 只取一小部分数据帧
- 将 DF 保存在磁盘上并从另一个脚本处理它们以重现问题
但是,在任何这些尝试中,结果都不同。要么两个 DF 都以具有 Object Dtype 的 Series 结束,要么都以 Int64 Dtype 结束。
对我来说,这很重要,因为稍后我需要那些 DF 的假人,如果某些 Int 系列是另一个 DF 上的 Object 系列,则列将不匹配。这个问题很容易解决,我只需要显式转换,但我仍然有一个疑问,我需要确认它:
如果我用数字替换一个对象系列(没有 NaN)的内容,这个系列是否有随机的可能性被强制转换为 Int64?
我认为这是我所面临的唯一解释
提前致谢。如果您找到任何方法来澄清我的问题,请编辑或评论
这是代码。我正在控制台中打印最重要的相关数据:Dtype、值和 Null 数
这是删除/替换之前的输出。好吧,我本可以打印一些更好读的东西,但想法很简单:在 Drop/Replace 之前,它们都有空值,它们都有“是”和“否”值,它们都是对象类型 Series。
Aaaa 这是在 Drop/Replace 之后。如您所见,它们现在都没有空值,它们都有 1/0,但其中一个是对象系列,另一个是 int64 系列。
我真的不明白:他们以前是同一类型的!
【问题讨论】:
-
能否提供数据重现?
-
你能在替换前后的那些系列上打电话给
value_counts吗?它们是否可能在替换后包含一些字符串(例如字符串 '1')? -
怀疑同样的事情。
-
@juske 我不能完全提供它们,因为它们是工业数据。我试图提取单个系列或数据集的一部分,但出现了问题中描述的问题
-
@ayhan 我在询问之前检查了 value_counts(),不,只有 1 和 0 值。