Python:从DataFrame按指定列名取值,无匹配时取err列值
嘿,我来帮你搞定这个DataFrame的取值需求!先把你的示例数据用代码还原出来,方便后续测试:
import pandas as pd df = pd.DataFrame({ 'A': [1, 2, 3, 4], 'B': [10, 20, 30, 40], 'C': [100, 200, 300, 400], 'err': ['x', 'y', 'z', 'q'], 'col': ['A', 'C', 'D', 'B'] })
接下来分两种场景给你实用方案:
方案1:直观逐行处理(适合小数据集)
如果你的数据量不大,用apply逐行判断是最容易理解的方式,逻辑和你描述的完全一致:
def fetch_result(row): target_col = row['col'] # 检查目标列是否存在于DataFrame中 if target_col in df.columns: return row[target_col] else: return row['err'] df['result'] = df.apply(fetch_result, axis=1)
运行后就能得到你想要的结果:
| A | B | C | err | col | result | |
|---|---|---|---|---|---|---|
| 0 | 1 | 10 | 100 | x | A | 1 |
| 1 | 2 | 20 | 200 | y | C | 200 |
| 2 | 3 | 30 | 300 | z | D | z |
| 3 | 4 | 40 | 400 | q | B | 40 |
方案2:向量化高效处理(适合大数据集)
如果你的数据集很大,逐行循环的apply效率会比较低,这时候用向量化操作能大幅提升速度:
# 先把所有列的数值整理成一个字典,键是列名,值是对应列的Series col_mapping = {col: df[col] for col in df.columns} # 用map匹配列名对应的数值,匹配不到的用err列填充 df['result'] = df['col'].map(col_mapping).fillna(df['err'])
这个方法完全避免了循环,执行效率更高,最终结果和方案1完全一致。
两种方案各有优势:小数据选方案1(好理解、易调试),大数据选方案2(速度快、性能优)。
内容的提问来源于stack exchange,提问作者Bartek Nowakowski
相关产品推荐
相关产品推荐

