如何用字典为Pandas Series赋值及覆盖DataFrame指定行
用多个字典覆盖Pandas DataFrame指定行的方法
刚好遇到过类似的需求,其实有两种很直观的方式可以实现,我结合你的示例给你一步步说明:
首先先重现你的初始DataFrame:
import pandas as pd data = {'A': range(3), 'B': range(3, 0, -1), 'C': [4, 0, 2]} df = pd.DataFrame(data) # 初始输出 # A B C # 0 0 3 4 # 1 1 2 0 # 2 2 1 2
假设你要覆盖第0行,用到的两个字典:
d1 = {'A': 1, 'C': 1} d2 = {'B': 2}
方法1:合并字典后一次性赋值
先把多个字典合并成一个完整的更新字典,再用loc定位目标行赋值,Pandas会自动匹配列名,只更新字典里存在的列:
# 合并字典(Python 3.5+支持的语法) update_dict = {**d1, **d2} # 定位第0行并赋值 df.loc[0] = update_dict # 执行后输出的df就是你想要的结果: # A B C # 0 1 2 1 # 1 1 2 0 # 2 2 1 2
如果你的字典里可能包含DataFrame没有的列,不想新增列的话,可以改成只更新存在的列:
# 筛选出DataFrame中存在的键 valid_keys = [key for key in update_dict if key in df.columns] df.loc[0, valid_keys] = [update_dict[key] for key in valid_keys]
方法2:逐个字典调用update方法
如果你不想合并字典,也可以直接对目标行的Series逐个调用update方法,它会原地更新匹配的列:
# 先更新d1的内容 df.loc[0].update(d1) # 再更新d2的内容 df.loc[0].update(d2)
这个方法的好处是如果你的字典是动态生成的(比如循环里逐个拿到的),可以直接循环调用update,不用先收集所有字典。
两种方法都能达到你要的效果,选哪种看你的实际场景就行~
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

