Python-Pandas:对DataFrame执行原地修改操作时如何避免KeyError
示例
创建测试df:
import pandas as pd import numpy as np def f_test_df(n_rows, n_cols): df1 = pd.DataFrame(np.random.rand(n_rows, n_cols)) df = df1.applymap(lambda x: round(x*10)) return df np.random.seed(seed=1) df1 = f_test_df(7, 7)

现在执行会修改原始DataFrame本身的原地操作:
df1.drop(columns=[2, 3, 4, 5, 6], inplace=True)

如果重复运行上述代码,会触发KeyError,因为此时DataFrame已经被修改,所有修改DataFrame本身的操作都存在该问题。
现有解决方案是使用try-except结构,如下所示:
try: df1.drop(columns=[2, 3, 4, 5, 6], inplace=True) except: pass
上述写法可以避免出现KeyError,但实现方式不够优雅。请问是否存在更符合Python风格的实现方式?在对原始df执行原地修改操作时,如何避免触发KeyError?
解答
pandas的drop方法原生提供了errors参数来处理这类场景,你只需要将参数值设为ignore,就会自动跳过不存在的列/行,不会抛出KeyError,无需额外写异常捕获逻辑,是最符合Python风格的原生解法:
df1.drop(columns=[2, 3, 4, 5, 6], inplace=True, errors='ignore')
errors参数默认值为raise,即遇到不存在的标签时抛出错误;改为ignore后,方法仅删除实际存在的目标标签,不存在的直接忽略,完全匹配需求。
另外更推荐优先避免使用原地操作,原地修改容易带来不可预期的副作用,常规写法直接将修改后的结果赋值给新变量即可:
df_new = df1.drop(columns=[2, 3, 4, 5, 6], errors='ignore')
内容的提问来源于stack exchange,提问作者Neeraj Hanumante
相关产品推荐
相关产品推荐

