在使用Pandas replace
函数交换列的两个值时,我偶然发现了一个奇怪且不一致的行为。当使用它来交换列中的整数时,我们有
df = pd.DataFrame({'A': [0, 1]})
df.A.replace({0: 1, 1: 0})
这产生了结果:
df
A
1
0
但是,对字符串值使用相同的命令时
df = pd.DataFrame({'B': ['a', 'b']})
df.B.replace({'a': 'b', 'b': 'a'})
我们得到了
df
B
'a'
'a'
任何人都可以解释我这种行为上的差异,或者指向我在文档中的页面处理在熊猫中使用整数和字符串时的不一致吗?
答案 0 :(得分:5)
是的,这绝对是一个错误,所以我开了一个新问题 - GH20656。
看起来pandas先后应用了替换。它首次替换,导致“a”被替换为“b”,然后是第二次,导致两个“b”被“a”替换。
总之,您所看到的相当于
df.B.replace('a', 'b').replace('b', 'a')
0 a
1 a
Name: B, dtype: object
肯定不应该发生什么。
使用str.replace
进行lambda
回调时,有一种解决方法。
m = {'a': 'b', 'b': 'a'}
df.B.str.replace('|'.join(m.keys()), lambda x: m[x.group()])
0 b
1 a
Name: B, dtype: object