关于用熊猫替换和Dtypes的说明

时间:2020-03-12 08:33:02

标签: python pandas

这是一个奇怪的问题。我无法生产MVE。

我在熊猫中有两个数据集。它们包含某些系列,该系列可以具有三个值:“是”,“否”,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中,我前面提到的Series的Dtype在删除NaN值并替换值之后会自动变为int64。在final_df2中,不会发生这种情况。它们包含相同的值(0和1),所以我真的不明白。

为了创建最小可行示例,我尝试

  • 隔离系列,对它们进行一次转换并检查结果
  • 仅获取一小部分数据框
  • 将DF保存在磁盘上,然后通过另一个脚本对其进行处理以重新创建问题

但是,在任何这些尝试中,结果都是不同的。要么两个DF都以具有Object Dtype的Series结束,要么都以Int64 Dtype结束。

这对我来说很重要,因为稍后我需要这些DF的虚拟对象,并且如果某些Int系列是另一个DF上的Object系列,则这些列将不匹配。这个问题很容易解决,我只需要明确地进行转换,但是我仍然有一个疑问,我需要确认一下:

如果我用数字替换对象系列(不含NaN)的内容,是否有可能将该系列转换为Int64?

我认为这是我所面临的唯一解释

先谢谢了。如果您有任何方法可以澄清我的问题,请编辑或评论


编辑1:Spyder的屏幕截图

这是代码。我正在控制台中打印最重要的相关数据:Dtype,值和Null数

这是放置/替换之前的输出。好吧,我本来可以打印出一些更容易阅读的东西,但是想法很简单:在放置/替换它们都具有空值之前,它们都具有“是”和“否”值,它们都是对象类型Series。

Aaaaand这是在放置/替换之后。如您所见,它们现在都没有null,它们都具有1/0,但是其中一个是对象Series,另一个是int64 Series。

我真的不明白:它们以前是同一类型!

1 个答案:

答案 0 :(得分:0)

这里是要复制的样本。 如果将col_1'0'更改为0,它将更改dtype

import pandas as pd
import numpy as np

data = {'col_1': ['Yes', 'No', np.nan, '0'], 'col_2': [np.nan, 'Yes', 'Yes', 'No']}
df=pd.DataFrame.from_dict(data)
d1=df[['col_1']]
d2=df[['col_2']]

print(d1.dtypes)
print(d2.dtypes)

final_df1 = d1.dropna(how='any').replace({"Yes":1, "No":0})
final_df2 = d2.dropna(how='any').replace({"Yes":1, "No":0})

print(final_df1.dtypes)
print(final_df2.dtypes)

您还可以转换final_df定义中的数据类型

final_df1 = d1.dropna(how='any').replace({"Yes":1, "No":0}).astype(int)
final_df2 = d2.dropna(how='any').replace({"Yes":1, "No":0}).astype(int)