我无法理解为什么使用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之间存在这种差异?
这在哪里记录了?!
答案 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')
因为n
是nan
的第一个字母(np.nan
仅表示为nan
)。