为什么 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
我正在尝试仅更改数据框中某些值的值:
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