我无法理解为什么使用dtype = str创建的Series会导致:
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之间存在这种差异?
这记录在哪里?!
解决方法:
现在是fixed in master,从17.0开始不应该是一个问题.
简而言之,DataFrames和Series都会创建一个空的NumPy数组并用np.nan值填充它,但DataFrame使用传递的str dtype作为此数组,而Series使用’O'(object)dtype覆盖它.
如果没有传入任何值,则两个类的__init__方法都会将空字典分配为默认数据: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被强制转换为NumPy dtype’< U1'(即一个unicode字符),因此v变为:
array(['n', 'n'], dtype='<U1')
因为n是nan的第一个字母(np.nan仅表示为nan).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。