如何基于列名不同的另一个DataFrame修改目标DataFrame的值?
高效批量更新DataFrame列值(无需if-else)
嘿,这个需求在处理大数据量的DataFrame时太常见了,用循环或者if-else逐行判断不仅代码繁琐,效率还极低。咱们直接用pandas的矢量化操作来搞定,完全符合你的要求,而且速度拉满!
先构造示例数据
首先咱们先把你给出的两个DataFrame还原出来,方便后续测试:
import pandas as pd # Table 1 table1 = pd.DataFrame( data={'Number': [1, 2, 3, 4]}, index=['A', 'B', 'C', 'D'] ) # Table 2 table2 = pd.DataFrame( data={'Alphabet': ['B', 'C'], 'Integer': [25, 30]} )
方案一:字典映射 + 填充缺失值
先把Table2转换成**{Alphabet: Integer}**的字典,然后利用index.map()匹配更新,再用fillna()保留原有的未匹配值:
# 生成更新字典 update_mapping = table2.set_index('Alphabet')['Integer'].to_dict() # 批量更新Number列,未匹配的用原值填充 table1['Number'] = table1.index.map(update_mapping).fillna(table1['Number']).astype(int)
方案二:用update()方法(推荐,更高效)
pandas的update()方法专门用来原地更新匹配到的值,只修改有对应映射的行,内存友好,特别适合大数据量场景:
# 把Table2转换成和table1匹配的索引+列名格式 update_series = table2.set_index('Alphabet')['Integer'].rename('Number') # 原地更新table1的Number列 table1.update(update_series)
最终输出结果
执行完上面任意一种方法后,table1就会变成你想要的样子:
Number Index A 1 B 25 C 30 D 4
为什么不用if-else?
pandas的矢量化操作是基于numpy实现的,底层是C级别的运算,比Python层面的循环/if-else快几十甚至上百倍,尤其是当你的DataFrame有几十万、上百万行的时候,这种效率差距会特别明显。
内容的提问来源于stack exchange,提问作者nubprog
相关产品推荐
相关产品推荐

