【问题标题】:Clarification about Replace and Dtypes with Pandas关于用 Pandas 替换和 Dtypes 的说明
【发布时间】: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?

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

提前致谢。如果您找到任何方法来澄清我的问题,请编辑或评论


编辑 1:来自 Spyder 的屏幕截图

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

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

Aaaa 这是在 Drop/Replace 之后。如您所见,它们现在都没有空值,它们都有 1/0,但其中一个是对象系列,另一个是 int64 系列。

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

【问题讨论】:

  • 能否提供数据重现?
  • 你能在替换前后的那些系列上打电话给value_counts吗?它们是否可能在替换后包含一些字符串(例如字符串 '1')?
  • 怀疑同样的事情。
  • @juske 我不能完全提供它们,因为它们是工业数据。我试图提取单个系列或数据集的一部分,但出现了问题中描述的问题
  • @ayhan 我在询问之前检查了 value_counts(),不,只有 1 和 0 值。

标签: python pandas


【解决方案1】:

这是要复制的示例。 如果您将 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)

【讨论】:

  • 正如我在问题中所说,问题不可重现。只需复制系列(使用 pd.copy())即可更改输出。出于这个原因,问题本身就是“pandas 如何处理这种隐式转换?它有什么意义吗?”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 2017-06-18
  • 2020-05-07
  • 2016-03-24
  • 1970-01-01
  • 2015-02-20
相关资源
最近更新 更多