阻止Pandas将int转换为float

use*_*465 19 python pandas

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

我明白,如果我插入NaNint列,熊猫将全部转化intfloat因为没有NaN一个值int.

然而,当我插入Nonestr列,熊猫都转换我intfloat为好.这对我来说没有意义 - 为什么第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
Run Code Online (Sandbox Code Playgroud)

输出是

   int   str
0    0  zero

   int   str
0  0.0  zero
1  1.0   NaN
Run Code Online (Sandbox Code Playgroud)

有没有办法使输出如下:

   int   str
0    0  zero

   int   str
0    0  zero
1    1   NaN
Run Code Online (Sandbox Code Playgroud)

没有重铸第一列int.

  • 我更喜欢使用int而不是float因为该列中的实际数据是整数.如果没有解决方法,我会float尽管使用.

  • 我不想重铸,因为在我的实际代码中,我不
    存储实际的dtype.

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

max*_*moo 25

如果设置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
Run Code Online (Sandbox Code Playgroud)

  • 你无法想象这个人如何帮助我,阅读200列的csv ......我实际上尝试了一个精心设计的dtypes字典,只是一遍又一遍地开始.谢谢. (4认同)

tot*_*ack 7

从 pandas 1.0.0 开始,我相信您还有另一种选择,即首先使用convert_dtypes。这会将数据帧列转换为支持 pd.NA 的数据类型,从而避免 NaN/None 的问题。

...

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

#   int   str
# 0   0  zero
# 1   1  NaN
Run Code Online (Sandbox Code Playgroud)