3 回答
TA贡献1786条经验 获得超11个赞
在熊猫中,infer_dtype()这可能会有所帮助。
用 Cython 编写(代码链接),它返回一个字符串,总结了传递对象中的值。它在 Pandas 的内部结构中被大量使用,所以我们可以合理地期望它在设计时考虑到了效率。
>>> from pandas.api.types import infer_dtype
现在,A 列是整数和其他一些类型的混合:
>>> infer_dtype(df.A)
'mixed-integer'
B列的值都是浮动类型:
>>> infer_dtype(df.B)
'floating'
C列包含字符串:
>>> infer_dtype(df.B)
'string'
混合值的一般“catchall”类型只是“混合”:
>>> infer_dtype(['a string', pd.Timedelta(10)])
'mixed'
浮点数和整数的混合是“混合整数浮点数”:
>>> infer_dtype([3.141, 99])
'mixed-integer-float'
为了使您在问题中描述的功能,一种方法可能是创建一个函数来捕获相关的混合案例:
def is_mixed(col):
return infer_dtype(col) in ['mixed', 'mixed-integer']
然后你有:
>>> df.apply(is_mixed)
A True
B False
C False
dtype: bool
TA贡献1811条经验 获得超4个赞
这是一种方法,它利用了在 Python3 中无法比较不同类型的事实。这个想法是运行max数组,作为内置函数应该相当快。它确实短路。
def ismixed(a):
try:
max(a)
return False
except TypeError as e: # we take this to imply mixed type
msg, fst, and_, snd = str(e).rsplit(' ', 3)
assert msg=="'>' not supported between instances of"
assert and_=="and"
assert fst!=snd
return True
except ValueError as e: # catch empty arrays
assert str(e)=="max() arg is an empty sequence"
return False
但是,它不会捕获混合数字类型。此外,不支持比较的对象可能会导致此问题。
但它相当快。如果我们去掉所有pandas开销:
v = df.values
list(map(is_mixed, v.T))
# [True, False, False]
timeit(lambda: list(map(ismixed, v.T)), number=1000)
# 0.008936170022934675
比较
timeit(lambda: list(map(infer_dtype, v.T)), number=1000)
# 0.02499613002873957
添加回答
举报