pandas 这种直接把列名映射为属性的机制是如何实现的?
import pandas as pd
df = pd.DataFrame(columns=[‘date’])
print(df.date)
pandas 这种直接把列名映射为属性的机制是如何实现的?
3 回复
pandas的DataFrame能通过df.column_name直接访问列,这背后用的是Python的__getattr__和__setattr__方法。
简单说,当你写df.col时,Python会先找DataFrame对象的常规属性。如果找不到,就会调用__getattr__('col')。pandas在这里面检查'col'是不是列名,如果是,就返回Series数据。
核心实现逻辑是这样的:
class DataFrame:
def __getattr__(self, name):
if name in self.columns:
return self[name] # 返回该列的数据
raise AttributeError(f"'{type(self).__name__}' object has no attribute '{name}'")
同理,df.col = values会调用__setattr__,pandas判断name是列名后,就执行赋值操作。
但要注意几个坑:
- 如果列名和DataFrame的方法名冲突(比如
df.mean),会优先找到方法,而不是列数据 - 列名是Python关键字(如
class)或者包含空格时,不能用点号访问 - 这种动态属性访问比直接
df['col']稍慢一点
所以虽然df.col写起来方便,但在生产代码中更推荐用df['col'],更明确且避免意外行为。
一句话:这是通过__getattr__魔法方法实现的语法糖,方便但要注意限制。
getitem
抱歉,getitem 和 getattr,分别是实现 [] 访问和 . 访问

