有效使用pandas dataframe.replace

时间:2015-07-16 09:08:20

标签: python pandas replace

我想从数据框NameAndIDName列中显示的NamesAndIDs列中删除文字,并将其放入名为{{{{}}的新列中1}}。但有时IDOnly中的文字实际上并未显示在Name中,因此我希望NameAndID列中显示为NaN

e.g。我想转向以下数据框:

IDOnly

成:

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

我的数据帧很大(125k行),这需要很长时间(50分钟后放弃)。我试过在一个小的随机样本(1000行)上计时,得到500毫秒的时间。这告诉我有些事情是错的。

问题:无论如何要快速实现我的目标?

我在另一个尺寸小25倍的数据帧上尝试了这个,并且它在6秒内运行,因此您可以预期在当前数据帧上需要6秒x 25 = 150秒或2.5分钟。

提前致谢。

罗布

修改

我尝试将我的代码拆分成块,并在大约1分钟内运行。所以我怀疑存在内存使用问题。

NamesAndIDs['IDOnly'] = NamesAndIDs['NameAndID'].replace(to_replace = 
                    NamesAndIDs['Name'], value = '', regex = True)

这很奇怪,因为我正在运行Yosemite OSX和8GB RAM。我的实际数据帧是8列宽,都带有文本变量。每个列条目的长度少于256个字符。所以8 * 256 * 125000/10 ^ 9 = 0.25 GB。

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

1 个答案:

答案 0 :(得分:0)

使用字符串拆分?

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始终存在且始终是字符串的最后一部分。