【发布时间】:2015-10-05 15:31:32
【问题描述】:
我想从数据框 (NamesAndIDs) 的 Name 列中出现的 NameAndID 列中删除文本,并将其放入名为 IDOnly 的新列中。然而,有时来自Name 的文本实际上并没有出现在NameAndID 中,所以我希望它在IDOnly 列中显示为NaN。
例如我想打开以下数据框:
Name NameAndID IDOnly
Lovely Place Lovely Place 6D456 NaN
Great Town Something 7GL2 NaN
进入:
Name NameAndID IDOnly
Lovely Place Lovely Place 6D456 6D456
Great Town Something 7GL2 NaN
我曾尝试通过以下方式使用DataFrame.replace:
NamesAndIDs['IDOnly'] = NamesAndIDs['NameAndID'].replace(to_replace =
NamesAndIDs['Name'], value = '', regex = True)
我的数据框很大(125k 行),这需要很长时间(50 分钟后放弃)。我尝试在一个小的随机样本(1000 行)上对其进行计时,并获得 500 毫秒的时间。这向我表明出了点问题。
问题:有没有办法快速实现我的目标?
我在另一个大小为 25 倍的数据帧上进行了尝试,它在 6 秒内运行,因此您预计在当前数据帧上它需要 6 秒 x 25 = 150 秒或 2.5 分钟。
提前致谢。
罗伯
编辑
我尝试将我的代码分成多个块,它在大约 1 分钟内运行。所以我怀疑存在内存使用问题。
numRows = NamesAndIDs.shape[0]
numSlic = 1000
for i in range(numSlic):
LB = i*numRows/numSlic
UB = min((i+1)*numRows/numSlic, numRows-1)
ind = NamesAndIDs.index[LB:UB]
NamesAndIDs.loc[ind,'IDOnly'] = NamesAndIDs.loc[ind, 'NameAndID'].replace(to_replace =
NamesAndIDs.loc[ind, 'Name'], value = '', regex = True)
这很奇怪,因为我正在运行具有 8GB RAM 的 Yosemite OSX。我的实际数据框是 8 列宽,都带有文本变量。每个列条目的长度少于 256 个字符。所以 8*256*125000/10^9 = 0.25 GB。
问题:为什么将我的代码拆分成块会使运行速度如此之快?
【问题讨论】:
-
loc 非常慢,根据我的经验,使用 .ix 会更快。曾经有人向我解释过这是为什么,但我不记得了。
-
这很有趣,你关于记忆的理论听起来很合理。就处理能力和速度而言,pandas 的优势实际上是数字而不是字符串,因此您甚至可以尝试完全在 pandas 之外执行此操作,看看它是如何工作的(当然,您可能仍然会发现存储在 pandas 中很方便) .