如何按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("---")
代码说明
data.groupby('addr'):先将原始数据按addr分组,确保每个分组内的行属于同一个地址。np.ceil(len(group)/2):计算当前分组需要拆分成多少块(比如3行的分组会拆成2块)。np.array_split(group, chunk_count):将分组DataFrame拆分为指定数量的块,自动处理不足2行的剩余行。batches.extend(chunks):将拆分后的所有子DataFrame添加到最终列表中。
执行后得到的batches列表完全符合需求:每个元素是最多2行的DataFrame,且所有行都属于同一个addr。
内容的提问来源于stack exchange,提问作者SM079
相关产品推荐
相关产品推荐

