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

如何按addr分组并将每组拆分为最多2行的DataFrame列表?

问题描述

通过pd.read_sql_query(query, cnxn)获取到如下DataFrame:

addr    value  d_no
=========================
XXX     1       A
YYY     2       B
XXX     3       C
XXX     4       D
YYY     5       E
ZZZ     6       F
ZZZ     7       G
ZZZ     8       H

原本通过batches = [d for _, d in data.groupby(['addr'])]按addr分组得到DataFrame列表,但现在需要每个列表元素的DataFrame最多包含2行,且同一元素内的行必须属于同一个addr。

解决方案

可以先按addr分组,再对每个分组的DataFrame进行分块处理,每个块最多保留2行,最后将所有块合并到同一个列表中:

import numpy as np
import pandas as pd

# 示例原始DataFrame(实际替换为你的查询结果)
data = pd.DataFrame({
    'addr': ['XXX', 'YYY', 'XXX', 'XXX', 'YYY', 'ZZZ', 'ZZZ', 'ZZZ'],
    'value': [1, 2, 3, 4, 5, 6, 7, 8],
    'd_no': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
})

batches = []
# 先按addr分组
for _, group in data.groupby('addr'):
    # 将每个分组拆分为最多2行的子DataFrame
    chunk_count = int(np.ceil(len(group) / 2))
    chunks = np.array_split(group, chunk_count)
    batches.extend(chunks)

# 查看结果(可选)
for idx, df in enumerate(batches):
    print(f"第{idx+1}个DataFrame:")
    print(df)
    print("---")

代码说明

  1. data.groupby('addr'):先将原始数据按addr分组,确保每个分组内的行属于同一个地址。
  2. np.ceil(len(group)/2):计算当前分组需要拆分成多少块(比如3行的分组会拆成2块)。
  3. np.array_split(group, chunk_count):将分组DataFrame拆分为指定数量的块,自动处理不足2行的剩余行。
  4. batches.extend(chunks):将拆分后的所有子DataFrame添加到最终列表中。

执行后得到的batches列表完全符合需求:每个元素是最多2行的DataFrame,且所有行都属于同一个addr。

内容的提问来源于stack exchange,提问作者SM079

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:52:18