Pandas的高效利用数据帧.rep

2024-10-04 07:35:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想删除出现在数据框(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。在

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


Tags: to数据name文本placenanlocreplace
1条回答
网友
1楼 · 发布于 2024-10-04 07:35:47

使用字符串拆分?在

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

相关问题 更多 >