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

Posted

技术标签:

【中文标题】Pandas 使用 .replace() 交换值的奇怪行为【英文标题】:Pandas weird behavior using .replace() to swap values 【发布时间】:2018-09-21 08:12:51 【问题描述】:

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

谁能向我解释这种行为差异,或者指向文档中的一个页面,该页面处理在 pandas 中使用整数和字符串时出现的不一致问题?

【问题讨论】:

【参考方案1】:

是的,这绝对是一个错误,所以我开了一个新问题 - GH20656。

看起来 pandas 连续应用替换。它进行第一次替换,导致“a”被替换为“b”,然后是第二次,导致两个“b”都被替换为“a”。

总之,你看到的等价于

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

0    a
1    a
Name: B, dtype: object

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


有一个使用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

【讨论】:

我同意,不一致之处在于 Series.str.replace() 函数。当您尝试DataFrame.replace('B': 'a': 'b', 'b': 'a') 时,DataFrame.replace() 会正确引发错误,而用于int 的版本Series.replace() 将它们映射到一个单独的数组中,然后正确替换整个列。不知何故,他们忘记保持Series.str.replace() 一致,该函数将dict 转换为有序集合并以特定顺序应用它们。 @Ricardo 我已经打开了一个问题,让我们看看开发人员怎么说。

以上是关于Pandas 使用 .replace() 交换值的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换

使用 str.replace 从 pandas 中的字符串中删除括号

在 Pandas 中重命名“None”值

在 pandas 数据框中使用 replace 和 str.startswith() 重命名值

使用正则表达式避免 pandas str.replace

Pandas映射(转化)dataframe中的布尔值True和False值到1和0数值使用replace函数