【发布时间】: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()] -
列表理解风格似乎确实取得了一些性能改进。关于是否有更快的方法来做到这一点的任何想法?这似乎应该是可并行化的,就像向列添加常量一样。