在熊猫中有效使用替换

spl*_*ter 3 python indexing series dataframe pandas

我希望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)
Run Code Online (Sandbox Code Playgroud)

这使

     1st  2nd
   0   a    2
   1   b    4
   2   c    6
Run Code Online (Sandbox Code Playgroud)

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

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

Zax*_*axR 7

虽然map确实更快,但replace在版本 19.2 中进行了更新(详细信息请参见此处)以提高其速度,从而使差异显着减小:

In [1]:
import pandas as pd


df = pd.DataFrame([[1,2],[3,4],[5,6]], columns = ['1st', '2nd'])
df = pd.concat([df]*10000, ignore_index=True)
df.shape

Out [1]:
(30000, 2)

In [2]:
idxDict = {1:'a', 3:"b", 5:"c"}
%timeit df['1st'].replace(idxDict, inplace=True)
%timeit df['1st'].update(df['1st'].map(idxDict))

Out [2]:
100 loops, best of 3: 12.8 ms per loop
100 loops, best of 3: 7.95 ms per loop
Run Code Online (Sandbox Code Playgroud)

此外,我修改了 EdChum 的 map 代码以 include update,虽然速度较慢,但​​可以防止未包含在不完整映射中的值更改为 nans。


EdC*_*ica 5

用于map执行查找:

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

为了避免没有有效密钥的情况,您可以通过 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
Run Code Online (Sandbox Code Playgroud)

所以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
Run Code Online (Sandbox Code Playgroud)

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