是否存在带返回值的pd.update()同类函数?pandas批量替换列如何实现
问题核心
DataFrame.update()是原地修改方法,返回值固定为None,因此你原来的字典推导式得到的所有value都是None,无法生成预期的新字典。以下是不同场景下的实现方案:
方案1:接受原地修改原字典的DataFrame
如果不需要保留df_dict1中的原始数据,直接在推导式中执行update后返回修改后的df即可:
df_dict_new = {key: (df.update(df_dict2[key]), df)[1] for key in df_dict1.keys() & df_dict2.keys()}
注意:该写法会直接修改
df_dict1中存储的原DataFrame对象,df_dict_new和df_dict1里的同key df指向同一个内存对象。
方案2:不修改原始数据,生成全新的df字典
如果需要保留原字典的原始数据,先对df做拷贝再执行update操作,完全复现update的功能逻辑。
推导式写法
df_dict_new = { key: (lambda d, d2: (d.update(d2), d)[1])(df.copy(deep=True), df_dict2[key]) for key in df_dict1.keys() & df_dict2.keys() }
普通循环写法(可读性更高,更推荐)
df_dict_new = {} # 仅处理两个字典共有的key,如需保留独有key可调整遍历范围 for common_key in df_dict1.keys() & df_dict2.keys(): # 深拷贝原df避免修改原始数据 copied_df = df_dict1[common_key].copy(deep=True) copied_df.update(df_dict2[common_key]) df_dict_new[common_key] = copied_df
方案3:完全替换共同列(性能更高,和update逻辑有差异)
如果你不需要保留原列中第二个df未覆盖的NA值,而是直接把共同列的所有值全部替换为第二个df的对应值(包括NA),可以用列赋值的方式,性能优于update:
df_dict_new = {} for common_key in df_dict1.keys() & df_dict2.keys(): df1 = df_dict1[common_key].copy() df2 = df_dict2[common_key] # 取两个df共有的列 common_cols = df1.columns.intersection(df2.columns) # 直接赋值替换所有对应位置的值 df1[common_cols] = df2[common_cols] df_dict_new[common_key] = df1
该方案和
update的核心差异:update仅用第二个df的非NA值覆盖原df,该方案会用第二个df的所有值(包括NA)覆盖原df对应位置。
内容的提问来源于stack exchange,提问作者DHJ
相关产品推荐
相关产品推荐

