为何Pandas指定dtype=np.str_时会忽略该数据类型?
问题分析与解决:Pandas指定
np.str_ dtype无效的原因 现象
尝试通过dtype=np.str_创建Series或用astype(np.str_)转换时,元素类型依然是Python原生str,而非预期的numpy.str_:
import pandas as pd import numpy as np s1 = pd.Series(["t1", "t2"], dtype=np.str_) print(type(s1[0])) # <class 'str'> print(type(s1.astype(np.str_)[0])) # <class 'str'>
但以下两种方式能得到numpy.str_类型的元素:
# 方式1:指定dtype=np.bytes_ s2 = pd.Series(["t1", "t2"], dtype=np.bytes_) print(type(s2[0])) # <class 'numpy.bytes_'> # 方式2:传入np.str_实例的列表 s3 = pd.Series([np.str_("t1"), np.str_("t2")]) print(type(s3[0])) # <class 'numpy.str_'>
原因
Pandas对字符串类型的处理有特殊逻辑:
- 当输入是Python原生字符串序列时,即使指定
np.str_,Pandas会自动将其转换为objectdtype(存储Python原生str),这是因为Pandas默认优先使用原生字符串类型,而非numpy的字符串类型。 np.bytes_属于字节类型,不在Pandas自动转换字符串的逻辑范围内,因此能保留numpy类型。- 直接传入
np.str_实例的列表时,Pandas会识别到元素是numpy对象,不会触发转换为原生str的逻辑,因此能保留numpy.str_类型。
解决办法
如果需要创建元素为numpy.str_类型的Series,可采用以下两种可靠方式:
- 直接传入
np.str_实例的列表
s = pd.Series([np.str_("t1"), np.str_("t2")])
- 使用
apply方法逐个转换元素
s = pd.Series(["t1", "t2"]).apply(np.str_)
内容的提问来源于stack exchange,提问作者Palermo
相关产品推荐
相关产品推荐

