【问题标题】:Pandas validate hex values for columnPandas 验证列的十六进制值
【发布时间】:2018-09-07 10:20:03
【问题描述】:

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

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

【问题讨论】:

  • 这篇文章中最底层的答案似乎提供了另一种解决方案stackoverflow.com/questions/9672615/…
  • 您使用的是哪个版本的 Python?我用 laaarge 十六进制尝试了 int(x,16) 。有效。没问题。在 Python 3+ 中,整数没有大小限制。
  • 我知道,这也适用于我。但它不使用lambda。所以我想这应该是问题,将编辑。谢谢!

标签: python pandas


【解决方案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 倍。

【讨论】:

  • 有消息说哪个更快?
  • 我找不到任何文档,但使用timeit 似乎可以确认列表理解更快。请参阅编辑后的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 2012-01-13
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多