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

Pie*_*ton 4 python string nan dataframe pandas

我无法理解为什么系列创建使用dtype=str结果:

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

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

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

为什么字符串只有字母"n"?

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

这记录在哪里?!

Ale*_*ley 7

现在这已经在master中修复,从17.0开始不应该是一个问题.


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

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

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

np.empty(n, dtype='O') # later filled with np.nan
Run Code Online (Sandbox Code Playgroud)

'O'数据类型能够持有任何类型的对象,所以np.nan在这里不会造成问题.

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

v = np.empty(len(index), dtype=str)
v.fill(np.nan)
Run Code Online (Sandbox Code Playgroud)

现在,当创建的str数据类型,np.empty被强制转换为与NumPy dtype'<U1'(即一个Unicode字符)等v变成:

array(['n', 'n'], dtype='<U1')
Run Code Online (Sandbox Code Playgroud)

因为n是第一个字母nan(np.nan仅表示为nan).

  • 我按照joris的建议并提交了问题:https://github.com/pydata/pandas/issues/9428 (2认同)