【问题标题】:pandas to_numeric downcast='signed' returning float64pandas to_numeric downcast='signed' 返回 float64
【发布时间】:2018-07-09 20:34:39
【问题描述】:

我有一个数据集,其中 pandas.read_csv() 处理将一些连续的数字列/特征/变量数据从对象适当地转换为 float64 [ 、 int64 或 uint8 ] 但不是其他数据。

然后,我尝试使用以下带有 downcast 参数的 pandas.to_numeric() 调用将本应转换为连续数字类型(特别是 int64)的列数据转换,但我仍然得到 float64 结果。

df.wc = pd.to_numeric(df.wc, errors='coerce', downcast='signed') 
# call to convert object to int64 vs float64 

在尝试将对象类型转换为最具体的连续数字类型时,是否存在会导致忽略该参数设置的典型列/功能/变量集问题?

【问题讨论】:

  • 当您尝试errors='raise' 时会发生什么?根据docs 向下转换仅适用于以下条件If not None, and if the data has been successfully cast to a numerical dtype。所以errors='coerce' 可能隐藏了一些东西。附带说明...您的数据集中是否有任何合法的浮点数? (即 1.0)
  • 您能否展示一个小样本数据框,其中包含未按预期转换的值?
  • 您的int 列是否包含NaN 值?那么这些列不能从 float -> int 转换。我今天问了一个类似的问题:stackoverflow.com/q/48518735/8881141

标签: python pandas


【解决方案1】:

根据documentation

... 根据 ...

将结果数据向下转换为 可能 的最小数字 dtype

根据我的实验,可以向下转换为整数值,例如

pd.to_numeric(pd.Series([1.0, 2.0]), downcast='unsigned')
0    1
1    2
dtype: uint8

不过,不能向下转换为整数值,例如

pd.to_numeric(pd.Series([1.1, 2.1]), downcast='unsigned')
0    1.1
1    2.1
dtype: float64

如果你想在结果中获取int64值,那么你可以申请pd.Series.astype

pd.Series([1.1, 2.1]).astype(int)
0    1
1    2
dtype: int64

你可能感兴趣

【讨论】:

  • 感谢有关解释 to_numeric 文档和您的结果的更多详细信息。在我的情况下,数据集不包含小数,例如pd.to_numeric(pd.Series([1000, 1150, 2250]), downcast='signed') and ='unsigned') 正在使用该示例系列生成预期的 int16 和 uint16,但不是使用我的实际数据集。因此,尽管设置了 downcast='signed' / 'unsigned' 参数,我似乎必须更仔细地梳理它以确定是什么导致它踢出 float64 结果。
  • 我尝试了 df.columnWithInts.astype(int) 并生成“ValueError:无法将浮点 NaN 转换为整数”,因此该集合中必须有一些看起来不像整数的观察结果跨度>
  • @myusrn 是的,您需要在转换为整数之前处理 NaN 值。查看pd.Series.fillna()pd.Series.dropna()。但您能做的最好的事情是提供您正在努力处理的数据样本。
  • 感谢您提供更多见解和建议。我在调用之前引入了 df.dropna(axis=0, how='any', inplace=True) 调用以将 object/str 转换为相关的整数和浮点列类型,此时我得到预期的 int64 和 float64 转换结果不涉及 pd.to_numeric 向下转换参数设置。所以我的困惑是我印象中的行/记录/观察,其中有问题的列/特征/变量有一个 NaN 条目不会影响控制 pd_numeric() 将整个列转换为哪种类型的逻辑。
【解决方案2】:

使用时

pandas.to_numeric(df[some_column], errors='coerce', downcast='integer')

似乎 some_column 中的任何“不可向下转换”值都会使整个列不向下转换。

一个演练是将非数值的删除和向下转换为有符号或 int 分开:

df[some_column]=pd.to_numeric(df[some_column], errors='coerce')
df.dropna(subset = [some_column], inplace = True)
df[some_column]=pd.to_numeric(df[some_column], downcast='integer')

第一行将非数值设置为 NaN。 第二行将它们放置到位。 第三行将它们转换为整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2018-07-10
    • 2017-10-03
    • 1970-01-01
    • 2023-02-13
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多