Pandas按规则拆分DataFrame 字典值合并为完整DataFrame
按列表值拆分DataFrame为字典存储的实现方案
核心需求
根据列表calvo_massflow的元素值,将目标DataFrame拆分为多个子DataFrame存入字典:
- 遍历到首次出现的元素值时,初始化字典对应键的存储结构
- 字典值优先为DataFrame类型,直接存储该键匹配的所有原df行数据
- 键为
calvo_massflow中的唯一值,示例中为1、2
原有代码问题
- 第一版实现:每个匹配行被单独封装为独立小DataFrame存入列表,未做合并,最终结构为列表嵌套零散DataFrame
- 第二版实现:pandas的行追加操作不会原地修改DataFrame,且逐行追加DataFrame的效率极低,旧版本
append方法需要接收返回值才能生效,pandas 2.0+版本已经彻底移除该方法
实现代码
方案1:pandas原生分组实现(推荐,效率最高)
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from scipy.stats import linregress from scipy.optimize import curve_fit calvo_massflow = [1, 2, 1, 2, 2, 1, 1] df = pd.DataFrame({"a":[1, 2, 3, 4, 11, 2, 4, 6, 7, 3], "b":[5, 6, 7, 8, 10, 44, 23, 267, 4, 66]}) # 给对应行添加分组标签,calvo_massflow长度为7,仅匹配df前7行 df_with_tag = df.iloc[:len(calvo_massflow)].copy() df_with_tag["tag"] = calvo_massflow # 分组后直接转为目标字典 result = {} for tag, group in df_with_tag.groupby("tag"): result[tag] = group.drop(columns=["tag"]).reset_index(drop=True)
方案2:保留原有循环逻辑的修改版本
完全贴合原本的遍历思路,不需要引入分组逻辑,先收集行再一次性合并:
result = {} for i, e in enumerate(calvo_massflow): if e not in result: # 初始化列表暂存匹配行,比逐行写入DataFrame效率高10~100倍 result[e] = [] # 无需遍历字典所有键,直接向对应键的列表追加当前行即可 result[e].append(df.iloc[[i]]) # 最后统一合并每个键下的所有行,得到完整DataFrame for key in result: result[key] = pd.concat(result[key], ignore_index=True)
输出效果
最终得到的result字典包含两个键:
- 键
1对应子DataFrame包含原df索引为0、2、5、6的行,列a值为[1,3,2,4],列b值为[5,7,44,23] - 键
2对应子DataFrame包含原df索引为1、3、4的行,列a值为[2,4,11],列b值为[6,8,10]
注:如果calvo_massflow长度和df长度不一致,上述逻辑默认按calvo_massflow的长度取df前N行匹配,可根据业务需求自行调整长度校验规则。
内容的提问来源于stack exchange,提问作者PoorPythonProgrammer
相关产品推荐
相关产品推荐

