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

循环拆分DataFrame多值单元格时重复显示最后值的问题排查

问题分析与解决方法

问题根源

你遇到的核心问题是重复引用同一个DataFrame对象:在循环中,你每次修改e_df["pers_function"]时,都是在修改同一个DataFrame实例,而列表list_to_append中存储的是这个实例的引用。当后续循环覆盖e_df的值时,之前添加到列表里的所有引用都会指向最新修改后的值,最终合并时所有行都显示最后一次赋值的职业。

修正代码

需要在每次拆分职业的循环中,创建e_df的深拷贝,确保每次添加到列表的是独立的DataFrame对象,而不是同一个引用。修改后的代码如下:

import pandas as pd

df2 = df_unique
df_size = len(df2)

list_to_append = []
try:
    for x in range(df_size):
        print(df_size - x)
        e_df = df2.iloc[[x]].fillna("n/a")
        
        if "," in e_df['pers_function'].values[0]:
            e_functions = e_df['pers_function'].values[0]
            function_list = e_functions.split(", ")
            for function in function_list:
                print(function)
                # 创建深拷贝,避免修改原对象
                temp_df = e_df.copy(deep=True)
                temp_df["pers_function"] = function
                temp_df["factoid_ID"] = "split_factoid"
                list_to_append.append(temp_df)
        else:
            print("Only one value found.")
    
    print(len(list_to_append))

except Exception as e:
    print(e)

df_split = pd.concat(list_to_append, axis=0, ignore_index=True, sort=False)
display(df_split)

关键修改说明

  • 使用temp_df = e_df.copy(deep=True)创建当前行DataFrame的独立副本,每次循环修改的都是新的副本,不会影响之前添加到列表中的对象。
  • 简化循环写法,直接遍历function_list而非用索引,代码更简洁易读。

更高效的Pandas原生实现

如果想避免手动循环,提升代码效率,推荐使用Pandas内置的str.split+explode方法:

import pandas as pd

# 拆分pers_function为列表格式
df2['pers_function'] = df2['pers_function'].str.split(', ')
# 将列表炸开为多行
df_split = df2.explode('pers_function').reset_index(drop=True)
# 为拆分后的行设置factoid_ID
df_split['factoid_ID'] = df_split.apply(
    lambda row: 'split_factoid' if len(row['pers_function'].split(', ')) > 1 else row['factoid_ID'],
    axis=1
)
display(df_split)

内容的提问来源于stack exchange,提问作者OnceUponATime

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:55:29