如何在Pandas explode()中设置D列非首行为0?含替代方案
实现Pandas拆分多值列并指定首行保留原值其余行设为0的需求
原始DataFrame
import pandas as pd A = ['ABC123', 'ABC124', 'ABC125', 'ABC126', 'ABC127'] B = ['ABC12', 'ABC13', 'ABC14', 'ABC15', 'ABC15'] C = ['aa, AA', 'bb', 'cc', 'dd', 'ee, EE'] D = [20, 30, 50, 54, 58] df = pd.DataFrame({'A':A, 'B':B, 'C':C, 'D':D})
用户拆分C列后,同一原始行拆分出的多行D列值重复,期望实现:除D列外其他列保留重复值,同一原始行拆分出的首行D列保留原值,其余行D列设为'00'。
方案一:基于explode()实现
- 将C列拆分为列表,同时添加临时列记录每个元素在列表中的位置序号
- 对C列和序号列执行explode拆分
- 根据序号判断是否为组内首行,设置对应D值
# 拆分C列为列表(处理逗号后的空格) df['C'] = df['C'].str.split(', ') # 添加分组内序号列 df['_seq'] = df['C'].apply(lambda x: list(range(len(x)))) # 拆分C列和序号列 df_exploded = df.explode(['C', '_seq']) # 设置D值:首行(序号0)保留原值,其余设为'00' df_exploded['D'] = df_exploded.apply(lambda r: r['D'] if r['_seq'] == 0 else '00', axis=1) # 删除临时序号列,得到最终结果 df_result = df_exploded.drop('_seq', axis=1) print(df_result)
方案二:不使用explode()的替代实现
通过遍历原始DataFrame的每一行,手动构造拆分后的新行,再拼接成结果DataFrame:
new_rows = [] # 遍历每一行,构造拆分后的行数据 for idx, row in df.iterrows(): # 拆分C列并去除每个值的前后空格 c_items = [item.strip() for item in row['C'].split(',')] for pos, c_val in enumerate(c_items): new_row = row.copy() new_row['C'] = c_val # 非首行设置D为'00' if pos != 0: new_row['D'] = '00' new_rows.append(new_row) # 转换为DataFrame并保留原索引 df_result = pd.DataFrame(new_rows).reset_index(drop=False) print(df_result)
内容的提问来源于stack exchange,提问作者user19903834
相关产品推荐
相关产品推荐

