我想删除出现在数据框(NamesAndIDs
)的NameAndID
列中的NameAndID
列中的文本,并将其放入名为IDOnly
的新列中。然而,有时来自Name
的文本实际上并没有出现在NameAndID
中,所以我希望它在IDOnly
列中以NaN
的形式出现。在
例如,我想打开以下数据帧:
Name NameAndID IDOnly
Lovely Place Lovely Place 6D456 NaN
Great Town Something 7GL2 NaN
进入:
^{pr2}$我尝试过以下方式使用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内存运行Yosemite OSX。我的实际数据帧是8列宽的,都有文本变量。每个列条目长度小于256个字符。所以8*256*125000/10^9=0.25GB。在
问:为什么将我的代码拆分成块会使运行速度更快?在
使用字符串拆分?在
假设ID始终存在,并且总是字符串的最后一部分。在
相关问题 更多 >
编程相关推荐