断言熊猫系列仅包含字符串

时间:2020-10-09 16:20:57

标签: python pandas

我的问题似乎很明显,令我惊讶的是它之前没有得到回答。抱歉,是这样。

当前我唯一可以断言的是断言一个系列dtype是一个对象('O')。但这并不能证明它仅包含字符串,因为由浮点数和整数组成的混合dtype系列也为'O'类型。 当然,可以通过断言每个元素都是字符串类型并使用apply函数来使用蛮力方法,但这可能很长,对于简单的检查来说似乎很复杂。

有没有办法断言它实际上只包含字符串,这是该系列的长期应用吗?

2 个答案:

答案 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通常是首选检查器。