阻止 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 时出错