Pandas技术问题:如何在DataFrame中插入可变数量的行?
Pandas实现递增序列行扩展的方法
我来帮你搞定这个需求!你想要根据ADO_incr_y - ADO_incr_x的差值,为每行生成从ADO_incr_x到ADO_incr_y的递增序列对,同时保持其他列不变对吧?
首先先明确你的输入和预期输出:
原始DataFrame
import pandas as pd df = pd.DataFrame({ "plan": ["3ABP3"], "ADO_ver_x": [25.0], "ADO_incr_x": [4.0], "ADO_ver_y": [25.0], "ADO_incr_y": [7.0] })
预期输出
plan ADO_ver_x ADO_incr_x ADO_ver_y ADO_incr_y 0 3ABP3 25.0 4.0 25.0 5.0 1 3ABP3 25.0 5.0 25.0 6.0 2 3ABP3 25.0 6.0 25.0 7.0
你之前用np.repeat的思路问题在于,它只是简单重复整行,没办法生成递增的序列值。下面给你两种符合Pandas/Python风格的实现方式:
方法一:直观的行生成 + explode展开
这种方法通过apply为每行生成对应的递增序列对,再用explode展开,逻辑清晰易懂,适合小数据集:
def generate_increment_rows(row): start_x = row["ADO_incr_x"] end_y = row["ADO_incr_y"] # 计算需要生成的行数 num_rows = int(end_y - start_x) # 生成x和y的递增序列 x_sequence = [start_x + i for i in range(num_rows)] y_sequence = [start_x + 1 + i for i in range(num_rows)] # 返回每行的字典列表 return [ { "plan": row["plan"], "ADO_ver_x": row["ADO_ver_x"], "ADO_incr_x": x, "ADO_ver_y": row["ADO_ver_y"], "ADO_incr_y": y } for x, y in zip(x_sequence, y_sequence) ] # 应用函数并展开成DataFrame result_df = df.apply(generate_increment_rows, axis=1).explode().apply(pd.Series).reset_index(drop=True) print(result_df)
方法二:高效的向量化操作
这种方法利用NumPy的向量化特性,避免循环,效率更高,适合大数据集:
import numpy as np # 计算每行需要生成的行数 repeat_counts = (df["ADO_incr_y"] - df["ADO_incr_x"]).astype(int) # 先重复原始行对应次数 repeated_df = df.loc[df.index.repeat(repeat_counts)].reset_index(drop=True) # 生成每行的偏移量(从0到n-1) offsets = np.concatenate([np.arange(count) for count in repeat_counts]) # 更新ADO_incr_x和ADO_incr_y的值 repeated_df["ADO_incr_x"] += offsets repeated_df["ADO_incr_y"] = repeated_df["ADO_incr_x"] + 1 # 因为y始终比x大1 print(repeated_df)
这两种方法都能得到你想要的结果,你可以根据数据集大小选择合适的方案~
内容的提问来源于stack exchange,提问作者fransua
相关产品推荐
相关产品推荐

