阻止 Pandas 将 int 转换为 float

Posted

技术标签:

【中文标题】阻止 Pandas 将 int 转换为 float【英文标题】:Stop Pandas from converting int to float due to an insertion in another column 【发布时间】: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 【参考方案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

【讨论】:

以上是关于阻止 Pandas 将 int 转换为 float的主要内容,如果未能解决你的问题,请参考以下文章

pandas CSV 文件读取不会将数据类型从 object 转换为 int

在 Pandas 数据框中将 float64 数组中的所有单元格展平为 int

将 float64 列转换为 datetime pandas 时出错

无法将 pandas.Series 转换为 dtype=np.float64 的 numpy.array

无法将Pandas Dataframe列转换为float

将 float 转换为 int,还是将 int 转换为 float?