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

如何在DataFrame中为分组大小小于3的组复制行至每组3行?

Pandas实现分组行调整:小于3行的组扩展至3行

示例数据构造

首先构造你提供的原始DataFrame:

import pandas as pd

df = pd.DataFrame({
    'ID': [0, 1, 2, 3, 3, 3, 3],
    'A': ['Data'] * 7,
    'B': ['Data'] * 7
})

方法一:按需求将小分组每行重复3次(匹配你的示例结果)

这种方法针对分组行数<3时,每行重复3次,正好让1行的组变成3行,行数>=3的组保持原样:

# 计算每个分组的大小
df['group_len'] = df.groupby('ID')['ID'].transform('count')

# 确定每行的重复次数:组大小<3则重复3次,否则1次
repeat_counts = df['group_len'].map(lambda x: 3 if x < 3 else 1)

# 执行重复并清理临时列
result = df.loc[df.index.repeat(repeat_counts)]
result = result.drop(columns=['group_len']).reset_index(drop=True)

执行后得到的结果完全匹配你给出的处理后DataFrame:

ID     A     B
0    0  Data  Data
1    0  Data  Data
2    0  Data  Data
3    1  Data  Data
4    1  Data  Data
5    1  Data  Data
6    2  Data  Data
7    2  Data  Data
8    2  Data  Data
9    3  Data  Data
10   3  Data  Data
11   3  Data  Data
12   3  Data  Data

方法二:将小分组统一扩展至3行(适配n=2的分组)

如果你的分组可能存在2行的情况,需要将其扩展至恰好3行(而非6行),可以使用分组apply的方式:

def adjust_group(group):
    target_len = 3
    current_len = len(group)
    if current_len < target_len:
        # 计算需要补充的行数,重复现有行直到达到目标长度
        repeats = (target_len + current_len - 1) // current_len
        extended = group.loc[group.index.repeat(repeats)].head(target_len)
        return extended
    else:
        return group

result = df.groupby('ID', group_keys=False).apply(adjust_group).reset_index(drop=True)

比如如果有一个ID=4的分组有2行,该方法会将其扩展为3行(第一行重复2次,第二行1次)。

关键逻辑说明

  • 方法一使用矢量化操作,效率更高,适合大数据量场景;
  • 方法二更灵活,可自定义目标行数,适配不同大小的小分组;
  • groupby('ID', group_keys=False)用于避免分组后添加额外的层级索引;
  • reset_index(drop=True)用于清理重复的原始索引,生成连续的新索引。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:50:49