【问题标题】:Stop Pandas from converting int to float due to an insertion in another column阻止 Pandas 将 int 转换为 float
【发布时间】:2017-03-08 05:02:23
【问题描述】:

我有一个DataFrame。两个相关的列如下:一个是int 的列,另一个是str 的列。

我了解,如果我将NaN 插入int 列,Pandas 会将所有int 转换为float,因为int 没有NaN 值。

但是,当我将None 插入str 列时,Pandas 也会将我所有的int 转换为float。这对我来说没有意义 - 为什么我在第 2 列中输入的值会影响第 1 列?

这是一个简单的工作示例(Python 2):

import pandas as pd
df = pd.DataFrame()
df["int"] = pd.Series([], dtype=int)
df["str"] = pd.Series([], dtype=str)
df.loc[0] = [0, "zero"]
print df
print
df.loc[1] = [1, None]
print df

输出是

   int   str
0    0  zero

   int   str
0  0.0  zero
1  1.0   NaN

有没有办法让输出如下:

   int   str
0    0  zero

   int   str
0    0  zero
1    1   NaN

不将第一列重铸为int

  • 我更喜欢使用int 而不是float,因为实际数据在 该列是整数。如果没有解决方法,我只会 不过使用float

  • 我宁愿不必重铸,因为在我的实际代码中,我不需要
    存储实际的dtype

  • 我还需要逐行插入数据。

【问题讨论】:

  • 这不仅适用于任何列值None,而且适用于float

标签: python pandas type-conversion type-inference


【解决方案1】:

如果您设置dtype=object,您的系列将能够包含任意数据类型:

df["int"] = pd.Series([], dtype=object)
df["str"] = pd.Series([], dtype=str)
df.loc[0] = [0, "zero"]
print(df)
print()
df.loc[1] = [1, None]
print(df)

   int   str
0    0  zero
1  NaN   NaN

  int   str
0   0  zero
1   1  None

【讨论】:

  • 你无法想象这个对我有什么帮助,在 200 列的 csv 中阅读......我实际上尝试了一个精心制作的 dict dtypes,只是一遍又一遍地重新开始。谢谢。
【解决方案2】:

从 pandas 1.0.0 开始,我相信您还有另一个选择,那就是首先使用 convert_dtypes。这会将数据框列转换为支持 pd.NA 的 dtypes,避免出现 NaN/None 的问题。

...

df = df.convert_dtypes()
df.loc[1] = [1, None]
print(df)

#   int   str
# 0   0  zero
# 1   1  NaN

【讨论】:

    【解决方案3】:

    如果你使用DataFrame.append添加数据,dtypes被保留,你不必重铸或依赖object

    In [157]: df
    Out[157]:
       int   str
    0    0  zero
    
    In [159]: df.append(pd.DataFrame([[1, None]], columns=['int', 'str']), ignore_index=True)
    Out[159]:
       int   str
    0    0  zero
    1    1  None
    

    【讨论】:

    • 不正确:df = pd.DataFrame(columns=["a1"]) ; df.append(pd.DataFrame([[1, 200]], columns=['a1', 'a2']), ignore_index=True) 打印 0 1 200.0,其中 200.0 显然是一个浮点数。
    • 当然,但是如果您指定 a2 在创建时具有 dtype float(在 OP 中就是这种情况),append 仍然可以按预期工作。
    【解决方案4】:

    紧接着

    df = pd.DataFrame()
    

    添加以下内容,它将整个系列初始化为 int。这对我有用。

    df['int'] = 0
    

    【讨论】:

      猜你喜欢
      • 2019-08-22
      • 2021-11-02
      • 2019-11-09
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多