如何在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
相关产品推荐
相关产品推荐

