为何abs、round等Python标准函数可直接作用于DataFrame列?
为什么Python内置的round/abs可以直接作用于pandas的DataFrame列?
这本质是Python内置函数的扩展机制和pandas的设计共同作用的结果:
1. 内置函数会调用对象的魔术方法
Python的abs()、round()这类内置函数,并不是只处理原生数值类型,它们会主动检查传入对象是否实现了对应的特殊魔术方法,如果有就调用该方法完成计算:
abs(obj)会触发obj.__abs__()round(obj, ndigits)会触发obj.__round__(ndigits)
而pandas的Series(也就是DataFrame的列对象)已经提前实现了这些魔术方法,所以直接把Series传给内置函数,和调用Series自己的.abs()、.round()方法效果完全一致——甚至可以说,df['MyCol'].abs()就是对__abs__方法的封装调用。
2. 内置函数的扩展机制:魔术方法
这些内置函数确实支持扩展到新类型,核心就是实现对应的魔术方法。任何自定义类只要实现了指定的魔术方法,就能被内置函数直接处理:
举个简单的自定义类例子:
class Temperature: def __init__(self, celsius): self.celsius = celsius # 让abs()可以处理Temperature对象,返回温度的绝对值 def __abs__(self): return Temperature(abs(self.celsius)) # 让round()可以处理Temperature对象,保留指定小数位 def __round__(self, ndigits=None): return Temperature(round(self.celsius, ndigits)) temp = Temperature(-12.345) print(abs(temp).celsius) # 输出12.345 print(round(temp, 1).celsius) # 输出-12.3
额外说明
pandas这么设计的目的是让API更贴近Python原生习惯,你不用特意切换到pandas专属的方法调用模式,用熟悉的内置函数就能完成操作,同时保证结果和pandas方法一致。
内容的提问来源于stack exchange,提问作者Jules Olléon
相关产品推荐
相关产品推荐

