当前位置: 首页 > 面试题库 >

在pandas中有效使用替换

曹高轩
2023-03-14
问题内容

我希望replace在python3中以有效的方式使用该功能。我拥有的代码可以完成任务,但是速度太慢,因为我正在处理大型数据集。因此,只要有折衷,我的工作重点就是效率而不是优雅。这是我想做的玩具:

import pandas as pd
df = pd.DataFrame([[1,2],[3,4],[5,6]], columns = ['1st', '2nd'])

       1st  2nd
   0    1    2
   1    3    4
   2    5    6


idxDict= dict()
idxDict[1] = 'a'
idxDict[3] = 'b'
idxDict[5] = 'c'

for k,v in idxDict.items():
    df ['1st'] = df ['1st'].replace(k, v)

这使

     1st  2nd
   0   a    2
   1   b    4
   2   c    6

如我所愿,但是花费的时间太长了。最快的方法是什么?

编辑:这是比该问题更集中和明确的问题,其解决方案与此类似。


问题答案:

用于map执行查找:

In [46]:
df['1st'] = df['1st'].map(idxDict)
df
Out[46]:
  1st  2nd
0   a    2
1   b    4
2   c    6

为了避免没有有效密钥的情况,您可以通过 na_action='ignore'

您还可以使用df['1st'].replace(idxDict)回答有关效率的问题:

时机

In [69]:
%timeit df['1st'].replace(idxDict)
%timeit df['1st'].map(idxDict)

1000 loops, best of 3: 1.57 ms per loop
1000 loops, best of 3: 1.08 ms per loop

In [70]:    
%%timeit
for k,v in idxDict.items():
    df ['1st'] = df ['1st'].replace(k, v)

100 loops, best of 3: 3.25 ms per loop

因此,map这里的使用速度快了3倍以上

在更大的数据集上:

In [3]:
df = pd.concat([df]*10000, ignore_index=True)
df.shape

Out[3]:
(30000, 2)

In [4]:    
%timeit df['1st'].replace(idxDict)
%timeit df['1st'].map(idxDict)

100 loops, best of 3: 18 ms per loop
100 loops, best of 3: 4.31 ms per loop

In [5]:    
%%timeit
for k,v in idxDict.items():
    df ['1st'] = df ['1st'].replace(k, v)

100 loops, best of 3: 18.2 ms per loop

对于30K行df,map速度要快约4倍,因此扩展性好于replace或循环



 类似资料:
  • 问题内容: 在Python的Pandas中,是否有任何方法可以替换值? 您可以使用另一个值并将其替换,但是如果要替换为值,则无法完成此操作,如果尝试使用该值,则会得到奇怪的结果。 所以这是一个例子: 返回成功的结果。 但, 返回以下结果: 为什么会返回如此奇怪的结果? 由于我想将此数据框倒入MySQL数据库,因此我不能将值放入数据框的任何元素中,而是要放置。当然,您可以先更改为,然后再转换为,但是

  • 问题内容: 我可能在做一些非常愚蠢的事情,但是我很沮丧。 我有一个数据框,我想用超过零的值替换特定列中的值。我以为这是实现此目标的一种方式: 如果将通道复制到新的数据框中,这很简单: 这完全符合我的要求,但似乎无法与通道一起用作原始数据帧的一部分。 问题答案: 可以在0.20.0之前的熊猫版本上正常工作,但是由于pandas为0.20.0 ,因此不推荐使用,因此应避免使用它。而是可以使用或索引器。

  • 我有一个熊猫数据框(通过导入csv文件创建)。我想用NaN替换空白值。这些空白值中有些是空的,有些包含(可变数量的)空格,,,等等。 使用这个线程中的建议 它会替换所有只包含空格的字符串,但也会替换每个包含空格的字符串,这不是我想要的。 如何仅用空格和空字符串替换字符串?

  • 问题内容: 我有一个这样的Pandas DataFrame: 我只想在值等于0的情况下用第二列()中的值替换值,然后(对于剩余的零值),再次使用第三列()进行替换。期望的结果是下一个: 我使用该函数完成了此操作,但它似乎太慢了。我认为这一定是一种更快的方法。 使用其他功能而不是该功能,有没有更快的方法呢? 问题答案: 使用起来更快。使用与您使用类似的模式: 但是,使用嵌套稍微快一点: 时机 使用以

  • 我有下表(df): 我想用empty_row替换dataframe中的NaNs。我该怎么做? 我怎么解决这个?

  • 所以假设我有一个包含大量ints和double的程序。如果我知道这个数字合适的话,是否值得把我的整数改为字节或短号? 我知道java没有无符号类型,但是如果我知道数字只为正数,我还能做什么吗? 我所说的高效主要是指处理。我假设,如果所有变量都是一半大小,垃圾收集器会快得多,计算也可能会快一些。(我想既然我在android上工作,我也需要担心一下ram。) 当我开始一个新项目的时候,值得从一开始就做