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是列名后,就执行赋值操作。

但要注意几个坑:

  1. 如果列名和DataFrame的方法名冲突(比如df.mean),会优先找到方法,而不是列数据
  2. 列名是Python关键字(如class)或者包含空格时,不能用点号访问
  3. 这种动态属性访问比直接df['col']稍慢一点

所以虽然df.col写起来方便,但在生产代码中更推荐用df['col'],更明确且避免意外行为。

一句话:这是通过__getattr__魔法方法实现的语法糖,方便但要注意限制。


getitem

抱歉,getitemgetattr,分别是实现 [] 访问和 . 访问

回到顶部