阻止Pandas将int转换为float

时间:2016-10-26 00:43:59

标签: python pandas

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

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

但是,当我将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

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

4 个答案:

答案 0 :(得分:21)

如果设置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

答案 1 :(得分:6)

自熊猫1.0.0起,我相信您还有另一种选择,那就是首先使用convert_dtypes。这样可以将数据框列转换为支持pd.NA的dtype,从而避免了NaN / None的问题。

...

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

#   int   str
# 0   0  zero
# 1   1  NaN

答案 2 :(得分:1)

这同样有效:

df["int"] = df["int"].astype(int)

来自https://stackoverflow.com/a/33313377/4355695

编辑:当列有空白时,这不会很好:(

答案 3 :(得分:0)

如果您使用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