如何在DataFrame各类数据的相邻行之间插入3个新行
针对每个Class在相邻行间插入新行的实现方案
嘿,这个需求我之前也碰到过,用pandas的分组功能就能完美解决,下面给你一步步拆解:
核心需求梳理
我们要给每个Class组内的每一对相邻行之间都插入3个新行,新行的Class和当前组保持一致,IncreasingNumber默认可以填充为NaN,要是你需要其他自定义值,后面也能轻松调整。
第一步:构造测试数据(模拟你的数据集)
先造个小样本方便快速验证效果,不用直接用31行的大数据:
import pandas as pd import numpy as np # 生成2个Class,每个Class各5行(代替你实际的31行) class_list = ["A"]*5 + ["B"]*5 num_list = list(range(3, 8)) + list(range(1, 6)) df = pd.DataFrame({"Class": class_list, "IncreasingNumber": num_list})
第二步:编写单组处理函数
这个函数专门负责给单个Class的子数据插入空行,逻辑很直白:遍历每一行,先把当前行加入结果,只要不是组内最后一行,就跟着插入指定数量的空行:
def insert_empty_rows(group, insert_num=3): processed_data = [] for idx, row in group.iterrows(): processed_data.append(row) # 排除组内最后一行,避免在末尾多余插行 if idx != group.index[-1]: # 构造空行:Class继承当前行,数值列默认填NaN empty_rows = pd.DataFrame({ "Class": [row["Class"]]*insert_num, "IncreasingNumber": [np.nan]*insert_num }) processed_data.append(empty_rows) # 拼接所有行与空行,重置索引 return pd.concat(processed_data, ignore_index=True)
第三步:分组应用函数,得到最终结果
用groupby按Class分组,把上面的函数套用到每个组上,最后合并所有组的处理结果:
# group_keys=False避免生成多余的分组索引列 final_df = df.groupby("Class", group_keys=False).apply(insert_empty_rows, insert_num=3)
效果示例
比如原Class A的前两行是:
Class IncreasingNumber
A 3
A 5
处理后会变成:
Class IncreasingNumber
A 3
A NaN
A NaN
A NaN
A 5
...(后续每对相邻行之间都按此规则插入空行)
如果需要给新行的IncreasingNumber填充其他值,比如0或空字符串,直接修改empty_rows里的[np.nan]*insert_num即可,比如改成[0]*insert_num就会填充为0。
内容的提问来源于stack exchange,提问作者Meso owe
相关产品推荐
相关产品推荐

