从字典创建pandas DataFrame后调用head()触发StopIteration错误问询
错误产生原因
- 迭代
df.groupby("Name")返回的record是固定长度为2的元组,结构为(分组键Name值, 该分组对应的DataFrame),你的代码将整个元组存入字典值列表,而非提取可用的分组数据本身。 pd.DataFrame.from_dict的orient='index'参数要求字典的值为可解析为单行数据的扁平结构,你存入的是嵌套了元组、DataFrame的多层结构,pandas尝试遍历解析这类非结构化嵌套对象时就会抛出StopIteration异常。- 冗余逻辑说明:groupby返回的分组键天然唯一,你写的
if record[0] in my_dict判断永远不会触发append分支,属于无效代码。
修复方案
根据时间序列分析的常见需求,有两种常用修复方式:
方案1:生成所有股票数据拼接的长表结构
如果需要保留date、close、Name三列的长表结构做逐行分析,直接合并groupby的分组结果即可,不需要手动构建字典:
import pandas as pd # 时间序列分析必须读取date列做时间标识,原代码遗漏了该字段 df = pd.read_csv('all_stocks_5yr.csv', usecols=["date", "close", "Name"]) # 提取每个分组的DataFrame直接合并 full_df = pd.concat([group for _, group in df.groupby("Name")], ignore_index=True) full_df.head()
方案2:生成时间为行、股票代码为列的宽表结构
如果需要对齐时间轴,做多个股票的收盘价横向对比,直接用pivot_table转换即可:
import pandas as pd df = pd.read_csv('all_stocks_5yr.csv', usecols=["date", "close", "Name"]) # 转换时间格式为pandas可识别的时间类型 df["date"] = pd.to_datetime(df["date"]) # 生成宽表 full_df = df.pivot_table(index="date", columns="Name", values="close") full_df.head()
内容的提问来源于stack exchange,提问作者eneko valero
相关产品推荐
相关产品推荐

