如何将嵌套对象结构的销售数据转换为Pandas DataFrame?
将自定义对象格式的销售数据转换为Pandas DataFrame
问题场景
现有如下格式的自定义对象销售数据,想要转换为Pandas DataFrame:
sales_data = Totalsales( product='y', sales=( specificsite(product='y', sales_percent=70.0, location_zip='12345'), specificsite(product='y', sales_percent=11.0, location_zip='23456'), specificsite(product='y', sales_percent=45.0, location_zip='34567'), specificsite(product='y', sales_percent=10.0, location_zip='45678') ) ) df = pd.DataFrame(sales_data)
运行后报错:
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'Totalsales' object is not iterable
期望生成的DataFrame格式:
product sales_percent location_zip 0 y 70.0 12345 1 y 11.0 23456 2 y 45.0 34567 3 y 10.0 45678
报错原因
Totalsales是自定义类的实例对象,本身不是可迭代结构,Pandas无法直接将其转换为DataFrame。需要先提取对象中存储实际数据的属性,再进行转换。
解决方法
首先提取sales_data中的sales属性(这是包含所有站点数据的元组),然后将每个specificsite对象转换为字典,最后传入pd.DataFrame:
完整代码示例
import pandas as pd # 假设你的类定义如下(如果未定义需先确保类具备对应属性) class specificsite: def __init__(self, product, sales_percent, location_zip): self.product = product self.sales_percent = sales_percent self.location_zip = location_zip class Totalsales: def __init__(self, product, sales): self.product = product self.sales = sales # 原始数据 sales_data = Totalsales( product='y', sales=( specificsite(product='y', sales_percent=70.0, location_zip='12345'), specificsite(product='y', sales_percent=11.0, location_zip='23456'), specificsite(product='y', sales_percent=45.0, location_zip='34567'), specificsite(product='y', sales_percent=10.0, location_zip='45678') ) ) # 转换为DataFrame df = pd.DataFrame([site.__dict__ for site in sales_data.sales]) print(df)
说明
sales_data.sales获取到所有站点数据的元组- 每个
specificsite对象通过__dict__属性获取其内部的属性键值对,组成字典列表 - 将字典列表传入
pd.DataFrame即可生成目标格式的表格
如果你的类是用dataclasses定义的,也可以用asdict方法更规范地转换对象为字典:
from dataclasses import dataclass, asdict import pandas as pd @dataclass class specificsite: product: str sales_percent: float location_zip: str @dataclass class Totalsales: product: str sales: tuple sales_data = Totalsales( product='y', sales=( specificsite(product='y', sales_percent=70.0, location_zip='12345'), specificsite(product='y', sales_percent=11.0, location_zip='23456'), specificsite(product='y', sales_percent=45.0, location_zip='34567'), specificsite(product='y', sales_percent=10.0, location_zip='45678') ) ) df = pd.DataFrame([asdict(site) for site in sales_data.sales]) print(df)
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

