Pandas奇怪的行为使用.replace()来交换值

时间:2018-04-11 12:26:29

标签: python string pandas dataframe replace

在使用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'

任何人都可以解释我这种行为上的差异,或者指向我在文档中的页面处理在熊猫中使用整数和字符串时的不一致吗?

1 个答案:

答案 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