为什么dtype = str的空数据框填充“n”?

时间:2015-02-05 21:19:21

标签: python string pandas dataframe nan

我无法理解为什么使用dtype=str创建的系列会产生这样的结果:

In [2]: pandas.Series(index=range(2), dtype=str)
Out[2]: 
0    NaN
1    NaN
dtype: object

但使用dtype=str创建的DataFrame会产生以下结果:

In [3]: pandas.DataFrame(index=range(2), columns=[0], dtype=str)
Out[3]: 
   0
0  n
1  n

为什么字符串只有字母“n”?

为什么Series和DataFrame之间存在这种差异?

这在哪里记录了?!

1 个答案:

答案 0 :(得分:7)

现在是fixed in master,从17.0开始不应该是一个问题。


简而言之,DataFrames和Series都会创建一个空的NumPy数组,并用np.nan值填充它,但DataFrame使用传递的str dtype作为此数组,而Series使用'O'覆盖它}(对象)dtype。

如果没有传入任何值,则两个类的__init__方法都会将空字典指定为默认数据:data = {}

在测试了什么类型的对象data之后,Series构造方法回退到生成np.nan值的数组但是使用Numpy的'O'数据类型(不是str数据类型) - 请参阅here,然后here

np.empty(n, dtype='O') # later filled with np.nan

'O'数据类型能够保存任何类型对象,因此np.nan不会导致任何问题。

DataFrame的__init__方法也最终使用np.empty,然后使用np.nan填充空数组。不同之处在于使用了指定的str数据类型(而不是'O'数据类型)。代码基本上是as follows

v = np.empty(len(index), dtype=str)
v.fill(np.nan)

现在,使用str数据类型创建时,np.empty会转换为dtype的NumPy '<U1'(即一个unicode字符),因此v变为:

array(['n', 'n'], dtype='<U1')

因为nnan的第一个字母(np.nan仅表示为nan)。