为何无法使用pd.DataFrame.replace替换Ellipsis?
为什么Pandas中scalar形式的replace无法替换Ellipsis?
先看你的测试代码:
>>> import pandas as pd >>> df = pd.DataFrame({'a': [1, 2, 3, 4], 'b': ['a', 'b', 'c', 'd'], 'c': [1.2, 3.4, 5.6, 7.8], 'd': [..., ..., ..., ...]}) >>> df a b c d 0 1 a 1.2 Ellipsis 1 2 b 3.4 Ellipsis 2 3 c 5.6 Ellipsis 3 4 d 7.8 Ellipsis
你遇到的问题是:用df.mask(df == Ellipsis, 1)能正常替换,但直接用df.replace(Ellipsis, 1)或df.replace(..., 1)会报错:
TypeError: Expecting 'to_replace' to be either a scalar, array-like, dict or None, got invalid type 'ellipsis'
但把Ellipsis放进字典或列表里(比如df.replace({Ellipsis: 1}))就能正常替换,还能反过来把1换成Ellipsis。
原因解释
Pandas的replace函数在参数校验阶段,对直接传入的scalar类型to_replace有特殊的类型限制——它并没有把Python中特殊的ellipsis类型(也就是Ellipsis对象,即...)认定为合法的scalar参数,因此直接传参时会触发类型错误。
而当你把Ellipsis放在字典、列表这类容器中传入时,参数类型是字典或数组,符合replace的参数要求。此时函数内部会遍历容器里的元素,把Ellipsis当作普通的匹配值处理,自然就能正常完成替换。
至于你能把数字1替换为Ellipsis,是因为1属于Pandas认可的scalar类型(整数),参数校验能通过,后续替换逻辑也就正常执行了。
内容的提问来源于stack exchange,提问作者U13-Forward
相关产品推荐
相关产品推荐

