【问题标题】:Efficient use of pandas dataframe.replace高效使用pandas dataframe.replace
【发布时间】:2015-10-05 15:31:32
【问题描述】:

我想从数据框 (NamesAndIDs) 的 Name 列中出现的 NameAndID 列中删除文本,并将其放入名为 IDOnly 的新列中。然而,有时来自Name 的文本实际上并没有出现在NameAndID 中,所以我希望它在IDOnly 列中显示为NaN

例如我想打开以下数据框:

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

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 RAM 的 Yosemite OSX。我的实际数据框是 8 列宽,都带有文本变量。每个列条目的长度少于 256 个字符。所以 8*256*125000/10^9 = 0.25 GB。

问题:为什么将我的代码拆分成块会使运行速度如此之快?

【问题讨论】:

  • loc 非常慢,根据我的经验,使用 .ix 会更快。曾经有人向我解释过这是为什么,但我不记得了。
  • 这很有趣,你关于记忆的理论听起来很合理。就处理能力和速度而言,pandas 的优势实际上是数字而不是字符串,因此您甚至可以尝试完全在 pandas 之外执行此操作,看看它是如何工作的(当然,您可能仍然会发现存储在 pandas 中很方便) .

标签: python pandas replace


【解决方案1】:

使用字符串拆分?

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

【讨论】:

  • 感谢您的建议,但 ID 位可能不在末尾或根本不存在。我真的只是想从“NameAndID”变量中删除“Name”变量(如果它存在的话)。
  • 我明白了。你也可以做一个正则表达式。如果代码将包含一个数字(如果存在),您可以利用它。我正在考虑获取代码而不是名称的方法......
猜你喜欢
  • 2018-05-27
  • 1970-01-01
  • 2015-12-12
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
相关资源
最近更新 更多