是否可以优化仅涉及某些行的pandas数据帧的更新?

时间:2014-11-10 10:44:35

标签: python optimization map pandas

我有一个pandas数据框。其中一个列(让我们称之为col1)包含名义值(例如ABC等等。我还有一个将这些名义值映射到数值的字典(例如:my_dict = {'A':3, 'B':1, 'C':1})。现在我按以下方式创建一个新列:

df['col2'] = map(my_dict, df['col1'])

现在假设我在字典中更改了一个值。例如,C键现在映射到7而不是1。我还想分别更新col2。其中一种方法是重新计算所有行。但是,也许有一种方法只能更改需要更改的行。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以使用loc并使用1的新映射字典键仅使用映射C更改值C

import pandas as pd

df = pd.DataFrame(['A','B','A','C','A','B','C','A','C'],columns=['col1'])
my_dict = {'A':3, 'B':1, 'C':1}

# by the way you need lambda with map
%timeit df['col2'] = map(lambda x: my_dict[x], df['col1'])
1000 loops, best of 3: 205 µs per loop

现在将 C my_dict键的值更改为 7

my_dict = {'A':3, 'B':1, 'C':7}

%timeit df['col2'] = map(lambda x: my_dict[x], df['col1'])
1000 loops, best of 3: 210 µs per loop

%timeit df.loc[df['col1']=='C']['col2'] = my_dict['C']
10 loops, best of 3: 43.7 ms per loop

两者都有相同的结果

df
  col1  col2
0    A     3
1    B     1
2    A     3
3    C     7
4    A     3
5    B     1
6    C     7
7    A     3
8    C     7

显然,在这种情况下使用loc更有效。