我有一个pandas数据框。其中一个列(让我们称之为col1
)包含名义值(例如A
,B
,C
等等。我还有一个将这些名义值映射到数值的字典(例如:my_dict = {'A':3, 'B':1, 'C':1}
)。现在我按以下方式创建一个新列:
df['col2'] = map(my_dict, df['col1'])
现在假设我在字典中更改了一个值。例如,C
键现在映射到7
而不是1
。我还想分别更新col2
。其中一种方法是重新计算所有行。但是,也许有一种方法只能更改需要更改的行。有没有办法做到这一点?
答案 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
更有效。