【问题标题】:Pandas weird behavior using .replace() to swap valuesPandas 使用 .replace() 交换值的奇怪行为
【发布时间】: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 中使用整数和字符串时出现的不一致问题?

【问题讨论】:

    标签: python string pandas dataframe replace


    【解决方案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 我已经打开了一个问题,让我们看看开发人员怎么说。
    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 2015-07-08
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多