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之间存在这种差异?
这记录在哪里?!
现在这已经在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).
| 归档时间: |
|
| 查看次数: |
510 次 |
| 最近记录: |