如何为Pandas DataFrame列设置可在操作后保留的描述属性
Pandas持久化列级属性的实现方案
问题原因
之前的方案失效是因为df['a']返回的是Series对象,没有给Series子类注册需要持久化的元数据,也没有在DataFrame子类中声明切片返回的Series用自定义的子类,导致操作后生成的新Series没有继承自定义的description属性。
方案1:同时子类化DataFrame和Series(匹配原使用习惯)
通过自定义两个子类,分别注册元数据和构造器,即可实现列级属性的持久化保留:
import pandas as pd # 自定义支持持久化属性的Series子类 class DescribedSeries(pd.Series): # 注册需要持久化的元数据字段 _metadata = ['description'] @property def _constructor(self): return DescribedSeries # 自定义支持持久化属性的DataFrame子类 class DescribedDataFrame(pd.DataFrame): _metadata = ['description'] @property def _constructor(self): return DescribedDataFrame # 声明切片操作返回的Series使用自定义子类 @property def _constructor_sliced(self): return DescribedSeries
测试效果:
data = {"a": [1, 2, 3], "b": [10, 12, 13]} df = DescribedDataFrame(data) df.description = "数据集总描述" df['a'].description = 'a列的描述' # 以下操作均不会抛出异常,属性正常保留 print(df.description) # 输出:数据集总描述 print(df.head().description) # 输出:数据集总描述 print(df['a'].description) # 输出:a列的描述 print(df['a'].head().description) # 输出:a列的描述
方案2:使用官方内置attrs属性(兼容性最优)
pandas从1.0版本开始原生支持.attrs属性,用于存储数据集的元数据,该属性会在绝大多数常用操作后自动保留,无需自定义子类:
import pandas as pd df = pd.DataFrame({"a": [1, 2, 3], "b": [10, 12, 13]}) # 存储数据集级描述 df.attrs['dataset_desc'] = "数据集总描述" # 用字典存储列级描述 df.attrs['column_desc'] = { "a": "a列的描述", "b": "b列的描述" }
测试效果:
df_head = df.head() print(df_head.attrs['dataset_desc']) # 输出:数据集总描述 print(df_head.attrs['column_desc']['a']) # 输出:a列的描述
你可以封装简单的工具方法简化列描述的读写操作,适配自己的使用习惯。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

