我的问题似乎很明显,令我惊讶的是它之前没有得到回答。抱歉,是这样。
当前我唯一可以断言的是断言一个系列dtype是一个对象('O')。但这并不能证明它仅包含字符串,因为由浮点数和整数组成的混合dtype系列也为'O'类型。 当然,可以通过断言每个元素都是字符串类型并使用apply函数来使用蛮力方法,但这可能很长,对于简单的检查来说似乎很复杂。
有没有办法断言它实际上只包含字符串,这是该系列的长期应用吗?
答案 0 :(得分:2)
没有简单的方法,但是可以将all
与生成器表达式一起使用:
s = pd.Series(list('ABCD'))
>>> all(isinstance(x, str) for x in s)
True
答案 1 :(得分:2)
我也会选择all
+ isinstance
。
作为一种更直观的选择,您可以apply
内置的type
函数
df = pd.DataFrame({'col': [1, 2, '3', '4', '5']})
col
0 1
1 2
2 3
3 4
4 5
>>> df['col'].apply(type) == str
0 False
1 False
2 True
3 True
4 True
Name: col, dtype: bool
可以执行(df['col'].apply(type) == str).all()
来检查所有True
的值。
最后一点,对于字符串的子类,使用type
可能会产生错误的结果。
例如:
class mystr(str):
pass
df = pd.DataFrame({'col': [1, 2, '3', '4', mystr('5')]})
注意区别:
>>> df['col'].apply(type) == str
0 False
1 False
2 True
3 True
4 False
Name: col, dtype: bool
但是
df['col'].apply(lambda s: isinstance(s, str))
0 False
1 False
2 True
3 True
4 True
Name: col, dtype: bool
因此,isinstance
通常是首选检查器。