You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 12:27:27