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()])