为了将列验证为数据框的十六进制值,我正在执行以下操作:
column = data_df[column_name]
try:
column.apply(lambda x: int(x, 16))
ok = True
except ValueError:
ok = False
此处的问题似乎是lambda
,因为在控制台上执行int(x, 16)
适用于任何大小的数字。
我得到一个例外,因为有些值太大了:
In [1]: df.col.apply(lambda x: int(x, 16))
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
...
OverflowError: Python int too large to convert to C unsigned long
性能如何对大数据执行此操作?你能想到一个更好的解决方案吗?
我是python的新手,所以请原谅:) 这是我的灵感来源:convert pandas dataframe column from hex string to int
答案 0 :(得分:1)
我无法重新创建您的错误,但是从我理解您的问题的方式来说,您要验证列中的所有值都是十六进制。
或许最好为自己评估每个十六进制而不是一次性尝试全部。
这应该有效
import pandas as pd
# Function that evaluates if a number is a hex
def is_hex(x):
try:
int(x, 16)
return True
except ValueError:
return False
# Testdata
df = pd.DataFrame({'hexes' : ['FF1231AAAD',
'4451481AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA923478413819AFCCCCBBBBBBDDDDDDDD',
'XXXXXXXXXX']})
# Apply our function using lambdas
df['validate'] = df['hexes'].apply(lambda x : is_hex(x))
# Alternatively use list comprehension (which I believe is faster than apply)
df['validate'] = [is_hex(x) for x in df['hexes']]
# Check that all values are True
df['validate'].all()
要确定哪个版本实际上更快,您可以尝试使用timeit
%timeit for x in range(100): df['hexes'].apply(lambda x : is_hex(x))
14.6 ms ± 156 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit for x in range(100): [is_hex(x) for x in df['hexes']]
3.04 ms ± 55.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
这似乎证实了列表理解实际上几乎快了5倍。