如何基于另一个DataFrame修改现有DataFrame并生成新DataFrame?
可行,以下是两种实现方法
方法一:遍历更新(适合小数据集)
先修正df_2的列名(第三列实际是对应修改列的新值,不是Age),然后遍历df_2的每一行,精准替换df_1中对应Name和对应列的值:
import pandas as pd # 初始化原始DataFrame data_1 = [['Michael', 40, 'Brown', 1], ['Dwight', 38, 'Brown', 2], ['Jim', 36, 'Blonde', 3]] df_1 = pd.DataFrame(data_1, columns=['Name', 'Age', 'Hair Color', 'IQ']) data_2 = [['Michael', 'Age', 42], ['Dwight', 'Hair Color', 'Red'], ['Jim', 'IQ', 135]] df_2 = pd.DataFrame(data_2, columns=['Name', 'Change', 'New_Value']) # 重命名第三列,避免歧义 # 遍历df_2执行替换 for _, row in df_2.iterrows(): df_1.loc[df_1['Name'] == row['Name'], row['Change']] = row['New_Value'] print(df_1)
运行结果:
Name Age Hair Color IQ 0 Michael 42 Brown 1 1 Dwight 38 Red 2 2 Jim 36 Blonde 135
方法二:透视表合并更新(适合大数据集)
通过将df_2转成宽表,再与df_1合并并更新,避免循环,效率更高:
import pandas as pd # 初始化原始DataFrame data_1 = [['Michael', 40, 'Brown', 1], ['Dwight', 38, 'Brown', 2], ['Jim', 36, 'Blonde', 3]] df_1 = pd.DataFrame(data_1, columns=['Name', 'Age', 'Hair Color', 'IQ']) data_2 = [['Michael', 'Age', 42], ['Dwight', 'Hair Color', 'Red'], ['Jim', 'IQ', 135]] df_2 = pd.DataFrame(data_2, columns=['Name', 'Change', 'New_Value']) # 将df_2转成宽表,行是Name,列是要修改的字段,值是新值 df_2_pivot = df_2.pivot(index='Name', columns='Change', values='New_Value').reset_index() # 合并并更新df_1,用df_2的新值覆盖df_1的旧值 df_updated = df_1.set_index('Name').combine_first(df_2_pivot.set_index('Name')).reset_index() # 修正数据类型(合并后部分字段可能转为float) df_updated[['Age', 'IQ']] = df_updated[['Age', 'IQ']].astype(int) print(df_updated)
运行结果和方法一完全一致。
内容的提问来源于stack exchange,提问作者Gules
相关产品推荐
相关产品推荐

