如何使用列表更新Pandas DataFrame中的多行数据?
实现Pandas DataFrame按指定匹配条件更新列值
初始数据与需求
初始DataFrame结构与数据:
A B C 0 1 a F 1 2 b F 2 3 c F 3 4 d F 4 5 e F
需要根据列表names=['a', 'd', 'e']匹配B列元素,将对应列表values=['T', 'T', 'G']的值替换到C列,最终得到目标DataFrame。
实现方法
首先构建初始DataFrame及定义所需列表:
import pandas as pd # 构建初始DataFrame df = pd.DataFrame({ 'A': [1, 2, 3, 4, 5], 'B': ['a', 'b', 'c', 'd', 'e'], 'C': ['F'] * 5 }) names = ['a', 'd', 'e'] values = ['T', 'T', 'G']
方法一:字典映射 + loc精准更新
这是常用且高效的方式,通过字典建立匹配关系后筛选目标行更新:
# 将names和values转为键值对映射字典 replace_map = dict(zip(names, values)) # 筛选B列在names中的行,更新对应C列的值 df.loc[df['B'].isin(names), 'C'] = df.loc[df['B'].isin(names), 'B'].map(replace_map)
先用isin定位需要更新的行,再通过map将B列的匹配值映射为对应新值,直接赋值给C列的目标行,不会改动其他行的C值。
方法二:apply逐行判断替换
逻辑直观,适合新手理解:
replace_map = dict(zip(names, values)) # 逐行判断,匹配则替换,否则保留原值 df['C'] = df.apply(lambda row: replace_map[row['B']] if row['B'] in replace_map else row['C'], axis=1)
通过apply遍历每一行,检查当前行B列的值是否在映射字典中,是则替换C列值,否则保留原C值。
方法三:numpy.where向量式替换
适合大数据量场景,向量化操作比逐行遍历效率更高:
import numpy as np replace_map = dict(zip(names, values)) # 向量式条件判断,批量更新 df['C'] = np.where(df['B'].isin(names), df['B'].map(replace_map), df['C'])
np.where批量处理所有行,第一个参数是判断条件(B列值在names中),第二个参数是满足条件时的替换值,第三个参数是不满足条件时的原值。
最终结果
执行任意一种方法后,DataFrame都会变为:
A B C 0 1 a T 1 2 b F 2 3 c F 3 4 d T 4 5 e G
内容的提问来源于stack exchange,提问作者winter
相关产品推荐
相关产品推荐

