循环拆分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
相关产品推荐
相关产品推荐

