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

Ric*_*rdo 8 python string replace dataframe pandas

replace在使用Pandas 函数交换列的两个值时,我偶然发现了Pandas 函数的奇怪且不一致的行为.当我用它来交换列中的整数时

df = pd.DataFrame({'A': [0, 1]})
df.A.replace({0: 1, 1: 0})
Run Code Online (Sandbox Code Playgroud)

这产生了结果:

df
A
1
0
Run Code Online (Sandbox Code Playgroud)

但是,对字符串值使用相同的命令时

df = pd.DataFrame({'B': ['a', 'b']})
df.B.replace({'a': 'b', 'b': 'a'})
Run Code Online (Sandbox Code Playgroud)

我们得到了

df
B
'a'
'a'
Run Code Online (Sandbox Code Playgroud)

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

cs9*_*s95 5

是的,这绝对是一个错误,所以我打开了一个新发行版GH20656

熊猫似乎先后应用替代品。它先进行替换,将“ a”替换为“ b”,然后进行第二次替换,将两个“ b”替换为“ a”。

总而言之,您所看到的等同于

df.B.replace('a', 'b').replace('b', 'a')

0    a
1    a
Name: B, dtype: object
Run Code Online (Sandbox Code Playgroud)

绝对不是应该发生的事情。


有一种str.replacelambda回调一起使用的解决方法。

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
Run Code Online (Sandbox Code Playgroud)