【问题标题】:float type appear when use replace method in pandas dataframe在熊猫数据框中使用替换方法时出现浮点类型
【发布时间】:2021-03-03 23:59:04
【问题描述】:
import pandas as pd
import numpy as np


df = pd.DataFrame(
    [
        [np.nan, 'None', 3],
        [np.nan, 5, 6],
        [7, 8, 9]
     ], columns=['a', 'b', 'c']
)

df.replace({np.nan: None}, inplace=True)
print(df)

df.replace({'None': None}, inplace=True)
print(df)

      a     b  c
0  None  None  3
1  None     5  6
2     7     8  9
     a    b  c
0  NaN  NaN  3
1  NaN  5.0  6
2  7.0  8.0  9

这是我的案例的小例子。 我想将nan,“None”替换为None。所以我用了两次替换 第一个替换方法像我想的那样工作得很好,但是 nan 在第二个替换中重生了,所有的 int 都因为 nan 而变成了 float。我不知道为什么 nan 重生 df.replace({'None': None}, inplace=True),我该如何解决?

【问题讨论】:

  • 如果df.replace({'None': np.nan}, inplace=True)怎么办?
  • 你需要可以为空的 int dtype:df.replace({'None': None}).astype(pd.Int64Dtype()), docs
  • 请问您为什么要使用 None 而不是 NaN?在大多数情况下,NaN 是指示 DataFrame 中缺失值的最佳方式。
  • @wwnde 它不起作用。
  • @anky 我最后只使用“Int64”。

标签: python pandas


【解决方案1】:

如果您想在具有nan 值的列中使用整数,则需要改用pd.NAnan 是一个浮点数,它将强制整数数组成为浮点数。查看documentation

解决方案

df = pd.DataFrame(
    [
        [np.nan, None, 3],
        [np.nan, 5, 6],
        [7, 8, 9]
    ], 
    columns=['a', 'b', 'c'],
)

# replace np.nan with pd.NA
# then convert columns types to Int32
df.fillna(pd.NA).astype('Int32')
Out[11]:
      a     b  c
0  <NA>  <NA>  3
1  <NA>     5  6
2     7     8  9

【讨论】:

    【解决方案2】:

    我们可以把它改成object

    out = df.replace({'None': None}).astype(object)
    Out[10]: 
         a    b  c
    0  NaN  NaN  3
    1  NaN    5  6
    2    7    8  9
    

    【讨论】:

    • 即使我不使用对象类型,您的回复也教会了我可变的方式。谢谢!
    【解决方案3】:

    听起来您希望列类型是整数而不是浮点数。您可以使用 pandas 版本 0.24.0 中引入的可为空整数 dtype。

    对于常规整数 dtype 的列,如果它获得空值,则会自动转换为 float dtype。请注意,如果您使用 pandas 可为空的整数 dtype,该列将不会变为浮点数,并且空值将表示为 &lt;NA&gt; pandas.NA 值。

    docs 中了解更多信息。

    【讨论】:

    • 通过您的回复,我知道可以为空的整数类型。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 2021-01-09
    • 2021-12-03
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多