如何在pandas中补充虚拟行使ID列每个取值对应的行数均为5
注意:请统一ID列的大小写,如果你的实际表中ID列名为小写
id,将代码中所有ID替换为id即可。
实现方案
你可以通过两种常见方式实现该需求,两种方式均兼容你已执行的df = df.groupby('ID').head(5)前置处理逻辑:
方式1:groupby + apply (逻辑直观,适合小数据量)
import pandas as pd # 定义缺省行的填充值 fill_vals = {'A': 'a0', 'B': 'b0', 'C': 'c0', 'D': 'd0'} # 分组补全逻辑 def pad_group(g, target_rows=5): pad_cnt = target_rows - len(g) if pad_cnt <= 0: return g # 生成待填充的虚拟行 pad_df = pd.DataFrame( {'ID': [g['ID'].iloc[0]] * pad_cnt, **fill_vals} ) return pd.concat([g, pad_df], ignore_index=True) # 执行补全 df = df.groupby('ID', group_keys=False).apply(pad_group).reset_index(drop=True)
方式2:多级索引重索引 (效率更高,适合十万行以上的大数据量)
import pandas as pd # 1. 给每个分组内的行标记组内序号 df['grp_idx'] = df.groupby('ID').cumcount() # 2. 构造全量索引:所有ID × 组内序号0~4 full_idx = pd.MultiIndex.from_product( [df['ID'].unique(), range(5)], names=['ID', 'grp_idx'] ) # 3. 重索引补全缺失行 df = df.set_index(['ID', 'grp_idx']).reindex(full_idx).reset_index() # 4. 填充空值,删除临时序号列 df[['A','B','C','D']] = df[['A','B','C','D']].fillna({ 'A': 'a0', 'B': 'b0', 'C': 'c0', 'D': 'd0' }) df = df.drop(columns='grp_idx')
两种方式执行后得到的df就是你期望的每个ID固定5行的结果。
内容的提问来源于stack exchange,提问作者Tanmay Bhatnagar
相关产品推荐
相关产品推荐

