当我在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
答案 0 :(得分:1)
如果您查看pandas.Series.str.replace
的文档,则会看到repl
参数可以是 string或callable ,但是不支持dict
请记住,不支持您的第一次尝试。
深入研究源代码(下面复制了关键部分),您仍然看到先检查string
或callable
,然后再检查{{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)"