我有DataFrame
。以下是两个相关列:一列是int
列,另一列是str
列。
我了解如果我将NaN
插入int
列,Pandas会将所有int
转换为float
,因为没有NaN
值int
。
但是,当我将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
。
我还需要逐行插入数据。
答案 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