Python 有效使用dataframe.replace

Python 有效使用dataframe.replace,python,pandas,replace,Python,Pandas,Replace,我想从数据帧(nameandids)的Name列中删除出现在Name列中的NameAndID列中的文本,并将其放入名为IDOnly的新列中。然而,有时Name中的文本实际上并不出现在NameAndID中,因此我希望它在IDOnly列中显示为NaN e、 g.我想打开以下数据帧: Name NameAndID IDOnly Lovely Place Lovely Place 6D456 NaN Great Town Someth

我想从数据帧(
nameandids
)的
Name
列中删除出现在
Name
列中的
NameAndID
列中的文本,并将其放入名为
IDOnly
的新列中。然而,有时
Name
中的文本实际上并不出现在
NameAndID
中,因此我希望它在
IDOnly
列中显示为
NaN

e、 g.我想打开以下数据帧:

Name            NameAndID             IDOnly

Lovely Place    Lovely Place 6D456    NaN
Great Town      Something 7GL2        NaN
进入:

我已尝试使用
DataFrame。请按以下方式替换

NamesAndIDs['IDOnly'] = NamesAndIDs['NameAndID'].replace(to_replace = 
                    NamesAndIDs['Name'], value = '', regex = True)
我的数据帧很大(125k行),这需要很长时间(50分钟后放弃)。我尝试在一个小的随机样本(1000行)上计时,得到了500毫秒的时间。这对我来说意味着出了问题

问:有没有办法快速实现我的目标

我在另一个小25倍的数据帧上尝试了这个方法,它只运行了6秒,因此您可以预期在当前数据帧上需要6秒x25=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内存运行约塞米蒂OSX。我的实际数据框有8列宽,全部带有文本变量。每个列条目的长度小于256个字符。所以8*256*125000/10^9=0.25GB

问题:为什么将代码拆分为块会使运行速度更快?

使用字符串拆分

import pandas as pd
df = pd.DataFrame({'NID' : ['Lovely Place 6D456', 'Great Town Something 7GL2']})
df['ID'] = pd.Series([val[-1] for val in df['NID'].str.split()])

假设ID始终存在,并且始终是字符串的最后一部分。

loc非常慢,根据我的经验,使用.ix会更快。有人曾经向我解释过为什么会这样,但我记不起来了。这很有趣,你关于记忆的理论听起来很有道理。就处理能力和速度而言,pandas的优势在于数字而不是字符串,因此您甚至可以尝试完全在pandas之外执行此操作,并了解其工作原理(当然,您可能仍然会发现存储在pandas中很方便)。感谢您的建议,但ID位可能不在末尾或根本不在那里。我只是想把Name变量从NameAndID变量中删除,我明白了。你也可以做一个正则表达式。如果代码将包含一个数字,如果它存在,您可以利用它。我在想办法把代码拿出来而不是名字。。。
import pandas as pd
df = pd.DataFrame({'NID' : ['Lovely Place 6D456', 'Great Town Something 7GL2']})
df['ID'] = pd.Series([val[-1] for val in df['NID'].str.split()])