【问题标题】:Convert Hex Column in Pandas Without Iterating在不迭代的情况下转换 Pandas 中的十六进制列
【发布时间】:2017-01-28 15:14:58
【问题描述】:

我正在尝试在 Python 3 中对 Pandas 数据框进行 bin 处理,以便对大型数据集进行更有效的分组。目前,性能瓶颈在于使用 .apply() 方法迭代数据帧。

列中的所有条目都是十六进制的,所以看起来 pd.to_numeric 函数应该完全符合我的要求。

我尝试了多种选择,但到目前为止都没有奏效。

#  This sets all values to np.nan with coerced errors, 'Unable to parse string' with raise errors.
dataframe[bin] = pd.to_numeric(dataframe[to_bin], errors='coerce') % __NUM_BINS__ 

# Gives me "int() Cannot convert non-string with explicit base"
dataframe[bin] = int(dataframe[to_bin].astype(str), 16) % __NUM_BINS__

# Value Error: Invalid literal for int with base 10 'ffffffffff'
dataframe[bin] = dataframe.astype(np.int64) % __NUM_BINS__ 

有什么建议吗?这似乎是人们过去必须解决的问题。

【问题讨论】:

  • 您是否尝试过此解决方案将列实体转换为字符串:stackoverflow.com/a/22231860/1607105?您可能需要在字符串转换后附加 0x 前缀,以便 int(x,16) 知道它也具有 HEX 值。
  • 我只是尝试转换为字符串并将 0x 附加到值,但仍然得到“int() 无法转换具有显式基数的非字符串”。我检查了我的数据框 a,实际值肯定是字符串(以 0xfffff 为例)。
  • 您仍然可以通过使用list-comprehension 并从中创建系列来获得一些性能改进。点赞:[int(x, 16) for x in ser.tolist()]
  • 列表理解风格似乎确实取得了一些性能改进。关于是否有更快的方法来做到这一点的任何想法?这似乎应该是可并行化的,就像向列添加常量一样。

标签: python pandas dataframe


【解决方案1】:

在上述 cmets 的一些帮助之后:完成此任务的更快方法是使用生成器函数。这样,如果提供的数据无法从十六进制转换,它就可以处理任何异常。

def bin_vals(lst):
    for item in lst:
        try:
             yield int(item, 16) % __NUM_BINS__
        except:
             yield __ERROR_BIN__ #whatever you store weird items in

然后在您的转换部分中,您将执行以下操作:

dataframe['binned_value'] = [bin for bin in bin_vals(df['val_to_bin'].tolist())]

这大大加快了遍历每一行的速度。它也比我最初使用的 apply 方法快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2015-06-09
    • 1970-01-01
    • 2019-01-01
    • 2018-01-12
    • 2015-10-26
    相关资源
    最近更新 更多