如何将Pandas DataFrame指定列非空值拆分为新行
Pandas DataFrame结构转换:拆分指定列非空值到新行
问题场景
现有如下DataFrame,需要将col_to_shift列的非空值拆分至新行,同时重复col1、col2的内容,其他列按规则调整:
- 若
col_to_shift非空,生成两行:- 保留
col_to_shift的值,col_not_to_shift1和col_not_to_shift2设为NaN col_to_shift设为NaN,col_not_to_shift1和col_not_to_shift2取原col_not_to_shift1的值
- 保留
- 若
col_to_shift为空,直接保留原行
原始DataFrame
col1 col2 col_to_shift col_not_to_shift1 col_not_to_shift2 0 a1 a2 a3 a4 a5 1 b1 b2 NaN b4 NaN 2 c1 c2 c3 c4 c5
目标DataFrame
col1 col2 col_to_shift col_not_to_shift1 col_not_to_shift2 0 a1 a2 a3 NaN NaN 1 a1 a2 NaN a4 a4 2 b1 b2 NaN b4 NaN 3 c1 c2 c3 NaN NaN 4 c1 c2 NaN c4 c4
原始数据生成代码
import numpy as np import pandas as pd data = {"col1": ['a1', 'b1', 'c1'], 'col2': ['a2', 'b2', 'c2'], 'col_to_shift': ['a3', np.NaN, 'c3'], 'col_not_to_shift1': ['a4', 'b4', 'c4'], 'col_not_to_shift2': ['a5', np.NaN, 'c5']} df = pd.DataFrame(data)
解决方案
通过遍历每行生成对应行数据,再拼接成新DataFrame即可实现需求:
rows = [] for _, row in df.iterrows(): # 生成第一行:保留col_to_shift,非移位列设为NaN row1 = row.copy() row1['col_not_to_shift1'] = np.nan row1['col_not_to_shift2'] = np.nan rows.append(row1) # 仅当col_to_shift非空时,生成第二行 if pd.notna(row['col_to_shift']): row2 = row.copy() row2['col_to_shift'] = np.nan # 将col_not_to_shift2同步为col_not_to_shift1的值 row2['col_not_to_shift2'] = row2['col_not_to_shift1'] rows.append(row2) # 合并行并重置索引,保持列顺序与原表一致 result_df = pd.concat(rows, axis=1).T.reset_index(drop=True)[df.columns]
执行上述代码后,result_df即为目标结构的DataFrame。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

