numpy 分配给ILOC调用时的隐式转换规则

eqqqjvef  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(142)

在使用iloc时,我注意到下面这行笨拙的隐式转换:

import numpy as np
import pandas as pd

df = pd.DataFrame({"x":[3,2,1]},dtype=np.int_) # x has dtype int

df.iloc[0,0] = np.nan # now x gets dtype float

df.iloc[1,0] = None # I would have expected dtype object - but no, the None is converted to a Nan and the dtype stays the same

那么,有人能解释一下内部使用的确切规则吗?我认为最广泛的dtype被搜索,可以科普所有给定的值。但显然这不是真的。
或者换个说法:什么时候转换dtype以科普给定的值,什么时候将值转换为给定的dtype?

ldxq2e6h

ldxq2e6h1#

Pandas首先被设计为处理数字值(整数,浮点数,日期......),所以我相信None被视为NaN是有意义的。
即使你强制一个对象dtype,pandas也会使用None作为NaN:

s = pd.Series({df.index[1]: None}, dtype='object')
s.dtype
# dtype('O')

df.iloc[1,0] = s
df.dtypes
# x    float64
# dtype: object

请注意,例外情况是使用列表来切片行:

df.iloc[[1], 0] = s
df.dtypes
# x    object
# dtype: object

print(df)
#       x
# 0   NaN
# 1  None
# 2   1.0

相关问题