You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()实现

  1. 将C列拆分为列表,同时添加临时列记录每个元素在列表中的位置序号
  2. 对C列和序号列执行explode拆分
  3. 根据序号判断是否为组内首行,设置对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:18:35