Pandas str.replace方法正则表达式标志引发不一致的异常

时间:2019-07-16 19:40:28

标签: python pandas

当我在regex=[True|False]方法中使用pd.Series.str.replace()标志时,我得到了矛盾的异常:

  • repl是字典=>它说repl must be a string or callable
  • repl是可调用的=>它说Cannot use a callable replacement when regex=False

我正在尝试将DataFrame索引中西班牙语日期的月份部分替换为相应的英文简称。

import pandas as pd
import numpy as np

# Define the months' short names in English and Spanish
ENG = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
ESP = ['ENE', 'FEB', 'MAR', 'ABR', 'MAY', 'JUN', 'JUL', 'AGO', 'SEP', 'OCT', 'NOV', 'DIC']

# Dictionary mapping Spanish months to English months
esp2eng = dict(zip(ESP, ENG))

# Function to make the dictionary "callable"
def eng_from_esp(key):
    return esp2eng[key]

# Create the DF with date in the "%d-%b-%y" format as index, where %b is the Spanish naming
idx = ['06-{}-19'.format(m) for m in ESP]
col = ['ordinal']
data = pd.DataFrame(np.arange(12).reshape((12, 1)),
                   index=idx,
                   columns=col)

data.index.str.replace('ENE', esp2eng, regex=False)
TypeError: repl must be a string or callable

data.index.str.replace('ENE', eng_from_esp, regex=False)
ValueError: Cannot use a callable replacement when regex=False

1 个答案:

答案 0 :(得分:1)

如果您查看pandas.Series.str.replace的文档,则会看到repl参数可以是 string或callable ,但是不支持dict

请记住,不支持您的第一次尝试。

深入研究源代码(下面复制了关键部分),您仍然看到先检查stringcallable,然后再检查{{1 }}标志。

regex

因此,您的第一次尝试(使用# Check whether repl is valid (GH 13438, GH 15055) if not (is_string_like(repl) or callable(repl)): raise TypeError("repl must be a string or callable") if regex: # omitted else: # omitted if callable(repl): raise ValueError("Cannot use a callable replacement when " "regex=False") 的字典)会跳出第一个repl支票,并显示消息if

您的第二次尝试通过了此检查,但随后在"repl must be a string or callable"支票的else块内被可调用的支票绊倒了。

因此,简而言之,没有不一致之处。确保可以将第一个错误消息 改进为类似于regex的内容,但这并不是必须的。


FWIW,这是一个熊猫“单线飞机”,应该可以达到预期的效果:

"repl must be a string or callable (unless you're using regex=False)"