为什么 np.where 函数似乎也适用于值

Why does the np.where function also seem to work on values

我正在尝试仅更改数据框中某些值的值:

test = pd.DataFrame({'col1': ['a', 'a', 'b', 'c'], 'col2': [1, 2, 3, 4]})
dict_curr = {'a':2}
test['col2'] = np.where(test.col1 == 'a', test.col1.map(lambda x: dict_curr[x]), test.col2)

但是,这似乎不起作用,因为即使我只查看 col1 中 'a' 的值,错误也会显示

KeyError: 'b'

暗示它还会查看值为 'b' 的 col1 的值。为什么是这样?我该如何解决?

问题是,当你调用np.where时,它的所有参数都是先求值,然后根据条件决定结果。因此,字典也会查询 'b''c',即使这些值稍后会被丢弃。可能最简单的修复是:

import pandas as pd
import numpy as np

test = pd.DataFrame({'col1': ['a', 'a', 'b', 'c'], 'col2': [1, 2, 3, 4]})
dict_curr = {'a': 2}
test['col2'] = np.where(test.col1 == 'a', test.col1.map(lambda x: dict_curr.get(x, 0)), test.col2)

这将为不在字典中的键提供值 0,但由于它稍后会被丢弃,因此您使用哪个值都没有关系。

获得相同结果的另一种简单方法是:

import pandas as pd

test = pd.DataFrame({'col1': ['a', 'a', 'b', 'c'], 'col2': [1, 2, 3, 4]})
dict_curr = {'a': 2}
test['col2'] = test.apply(lambda x: dict_curr.get(x.col1, x.col2), axis=1)

错误源自 test.col1.map(lambda x: dict_curr[x]) 部分。您在 dict_curr 中查找 col1 的值,其中只有 'a' 的条目,没有 'b'.

的条目

您也可以只索引数据框:

test.loc[test.col1 == 'a', 'col2'] = 2