如何实现pandas DataFrame指定列新增并按规则重复行转换
pandas DataFrame 行列扩展实现方案
实现思路
- 第一步:先明确固定列(不需要修改的公共列,比如示例中的
id、A、B、C)和目标列(需要按规则拆分的列,比如示例中的X、Y、Z) - 第二步:按目标列的数量
n,将原有每行重复n次,得到基础扩展表 - 第三步:新增
n-1个带i后缀的对应列(目标列的前n-1个) - 第四步:按行索引规则给所有目标相关列赋值:对应位置保留原值,其余位置填
0
通用实现代码
import pandas as pd def expand_df(df, fixed_cols, target_cols): n = len(target_cols) # 1. 重复行,生成基础扩展数据 expanded = df.loc[df.index.repeat(n)].reset_index(drop=True) # 2. 新增n-1个带i后缀的列 new_cols = [f"{col}i" for col in target_cols[:-1]] # 初始化所有目标相关列默认值为0 for col in new_cols + target_cols: expanded[col] = '0' # 3. 按规则赋值 for row_idx in range(n): # 给原目标列赋值:第row_idx行的第row_idx个目标列填原值 expanded.loc[row_idx::n, target_cols[row_idx]] = df[target_cols[row_idx]].repeat(n).values # 给新增的i列赋值:所有行号大于row_idx的位置,填对应列的原值 if row_idx < len(new_cols): expanded.loc[row_idx+1::n, new_cols[row_idx]] = df[target_cols[row_idx]].repeat(n).values # 调整列顺序为 固定列 + 新增i列 + 原目标列 expanded = expanded[fixed_cols + new_cols + target_cols] return expanded # 测试调用 if __name__ == "__main__": # 原始数据 df = pd.DataFrame(data={ 'id': ['1'], 'A' : ['a1'], 'B' : ['b1'], 'C' : ['c1'], 'X' : ['x1'], 'Y' : ['y1'], 'Z' : ['z1'] }) # 定义固定列和目标列 fixed_cols = ['id', 'A', 'B', 'C'] target_cols = ['X', 'Y', 'Z'] df_new = expand_df(df, fixed_cols, target_cols) print(df_new)
输出验证
运行上述代码得到的df_new结构和预期结构完全一致:
id A B C Xi Yi X Y Z 0 1 a1 b1 c1 0 0 x1 0 0 1 1 a1 b1 c1 x1 0 0 y1 0 2 1 a1 b1 c1 x1 y1 0 0 z1
该实现支持任意数量的目标列,只需修改
target_cols参数即可适配n个目标列的扩展需求。
内容的提问来源于stack exchange,提问作者zdesam
相关产品推荐
相关产品推荐

