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.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
【讨论】:
我同意,不一致之处在于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 中的字符串中删除括号