【问题标题】:Convert floats to ints of a column with numbers and nans将浮点数转换为具有数字和 nan 的列的整数
【发布时间】:2020-08-26 00:04:39
【问题描述】:

我正在使用 Python 3.6 和 Pandas 1.0.3。

我想将浮点数从“A”列转换为 int...此列有一些 nan 值。

所以我跟着post 使用了@jezrael 的解决方案。

但我收到以下错误: “TypeError:不能安全地将非等效 float64 转换为 int64”

这是我的代码

import pandas as pd
import numpy as np

data = {'timestamp': [1588757760.0000, 1588757760.0161, 1588757764.7339, 1588757764.9234], 'A':[9087.6000, 9135.8000, np.nan, 9102.1000], 'B':[0.1648, 0.1649, '', 5.3379], 'C':['b', 'a', '', 'a']}
df = pd.DataFrame(data)
df['A'] = pd.to_numeric(df['A'], errors='coerce').astype('Int64')
print(df)

我错过了什么吗?

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    你的问题是你有 true 浮点数,而不是浮点形式的整数。因此出于安全原因,pandas 不会转换它们,因为您会获得 other 值。

    所以您需要首先将它们明确地四舍五入为整数,然后才使用.astype() 方法:

    df['A'] = pd.to_numeric(df['A'].round(), errors='coerce').astype('Int64')
    

    测试:

    print(df)
    
          timestamp     A       B  C
    0  1.588758e+09  9088  0.1648  b
    1  1.588758e+09  9136  0.1649  a
    2  1.588758e+09   NaN           
    3  1.588758e+09  9102  5.3379  a
    

    【讨论】:

    • 谢谢@MarianD。这个解决方案似乎给出了与“NYC Coder”相同的结果。值“nan”转换为“”。是否可以像原来一样将此值转换为“nan”?我将更新我的帖子以解释我通过您的解决方案得到的结果
    • @David,不。 nan 的数据类型为float64,并且一列中的所有数据必须是相同的数据类型; Int64 具有 NaN 值的数据类型是实验性的,可能会在未来的 pandas 版本中被删除。
    • 有效。谢谢你的澄清。您的回答也很好,我得到的“”根本不烦人,因为我可以将它们视为空数据。非常感谢@MarianD!
    【解决方案2】:

    一种方法是将 NaN 转换为整数:

    df['A'] = df['A'].fillna(99999999).astype(np.int64, errors='ignore')
    df['A'] = df['A'].replace(99999999, np.nan)
    df
    
        timestamp   A   B   C
    0   1.588758e+09    9087    0.1648  b
    1   1.588758e+09    9135    0.1649  a
    2   1.588758e+09    NaN     
    3   1.588758e+09    9102    5.3379  a
    

    【讨论】:

    • df['A'] = df['A'].astype(np.int64, errors='ignore')
    • 这不会将其更改为整数。这将忽略所有错误,包括 float 到 int 的转换错误。
    • 确实如此。我想保留值'nan'。
    • 检查编辑的答案。不幸的是,没有很好的方法来做到这一点。
    • 谢谢@NYC Coder,我刚刚查过了。但它似乎不起作用,除非通过 df['A'] = df['A'].fillna(99999999).astype(np.int64, errors='ignore').astype('Int64') 更改以下行 df['A'] = df['A'].fillna(99999999).astype(np.int64, errors='ignore') 但并不完美,因为 nan 值已转换为
    猜你喜欢
    • 2017-03-20
    • 2018-02-18
    • 2018-04-30
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2021-11-16
    相关资源
    最近更新 更多