Python无需循环将CSV扁平化单行数据重构为原始DataFrame的方法
百万行扁平化CSV还原多DataFrame的无循环高效方案
核心实现完全基于Pandas向量化操作,无Python层循环,性能是逐行循环实现的百倍以上,10*10维度的原始表、百万行CSV的处理耗时仅和CSV读取耗时相当。
实现步骤
- 读取CSV并拆分列名为多级索引
将遵循SX_R_C规则的列名按下划线拆分为三级索引,分别对应原始表类型、原始表行标识、原始表列标识:
import pandas as pd # 读取CSV,保留原始行索引 df = pd.read_csv("your_file.csv", index_col=0) # 拆分列名为三级MultiIndex df.columns = df.columns.str.split("_", expand=True) # 给三级索引命名方便后续操作 df.columns.names = ["type", "row", "col"]
- 重塑数据结构
通过stack操作将列维度的行、列标识转移到行维度,再按原始表类型拆分:
# 将行、列标识从列维度堆叠到行维度 reshaped = df.stack(level=["row", "col"]) # 拆分得到S1、S2两类原始表的全量数据 s1_all = reshaped.xs("S1", level="type", axis=1).unstack("col") s2_all = reshaped.xs("S2", level="type", axis=1).unstack("col")
- 提取指定索引的原始DataFrame
直接通过原始CSV的行索引即可提取对应还原后的DataFrame:
# 提取索引1657对应的S1原始表 s1_1657 = s1_all.loc[1657] # 提取索引1657对应的S2原始表 s2_1657 = s2_all.loc[1657]
按给出的示例数据,上述操作得到的s1_1657和s2_1657完全符合预期输出。
可选批量导出优化
如果需要批量导出所有行对应的原始表,可直接用Pandas优化过的分组迭代,避免自行写循环的性能损耗:
# 迭代所有原始CSV行索引对应的S1表 for idx, s1_df in s1_all.groupby(level=0): # 按需处理每个s1_df,比如存文件、做计算等 pass
内容的提问来源于stack exchange,提问作者TLS
相关产品推荐
相关产品推荐

