Pandas验证列的十六进制值

时间:2018-03-28 16:13:15

标签: python pandas

为了将列验证为数据框的十六进制值,我正在执行以下操作:

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

1 个答案:

答案 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倍。