从 Pandas 数据帧中删除行时出现 KeyError

KeyError when dropping rows from Pandas dataframe

我正在尝试从 Pandas 数据框中删除一些行,因为它们会被视为数据中的异常值。尝试使用教授教我的方法删除一些行时出现 KeyError。

gdp_2019_outliers = np.where(df_gdp['2019'] > 6)
df_gdp.drop(gdp_2019_outliers[0], inplace=True)
gdp_2019_outliers_neg = np.where(df_gdp['2019'] < -3)
df_gdp.drop(gdp_2019_outliers_neg[0], inplace=True) # stacktrace points here as the cause

gdp_2020_outliers = np.where(df_gdp['2020'] > 3)
df_gdp.drop(gdp_2020_outliers[0], inplace=True)
gdp_2020_outliers_neg = np.where(df_gdp['2020'] < -15)
df_gdp.drop(gdp_2020_outliers_neg[0], inplace=True)

因此,我使用 np.where() 找到异常值,然后将行列表传递给 drop()。不过,它似乎试图删除数据框中不再存在的行——就像前两行代码删除了以某种方式重新找到的行。

有什么想法吗?有没有更好的方法来使用条件删除行?

堆栈跟踪:

Traceback (most recent call last):
  File "C:\Users\colto\Documents\Spring 2022\Data Sciences\Module 5\DataWrangling\data_wrangling_project.py", line 104, in <module>
    df_gdp.drop(gdp_2019_outliers_neg[0], inplace=True)
  File "C:\Users\colto\Documents\Spring 2022\Data Sciences\Module 5\DataWrangling\venv\lib\site-packages\pandas\util\_decorators.py", line 311, in wrapper
    return func(*args, **kwargs)
  File "C:\Users\colto\Documents\Spring 2022\Data Sciences\Module 5\DataWrangling\venv\lib\site-packages\pandas\core\frame.py", line 4956, in drop
    return super().drop(
  File "C:\Users\colto\Documents\Spring 2022\Data Sciences\Module 5\DataWrangling\venv\lib\site-packages\pandas\core\generic.py", line 4279, in drop
###############################################################################################################
    obj = obj._drop_axis(labels, axis, level=level, errors=errors)
  File "C:\Users\colto\Documents\Spring 2022\Data Sciences\Module 5\DataWrangling\venv\lib\site-packages\pandas\core\generic.py", line 4323, in _drop_axis
    new_axis = axis.drop(labels, errors=errors)
  File "C:\Users\colto\Documents\Spring 2022\Data Sciences\Module 5\DataWrangling\venv\lib\site-packages\pandas\core\indexes\base.py", line 6644, in drop
    raise KeyError(f"{list(labels[mask])} not found in axis")
KeyError: '[152] not found in axis'

gdp_columns = ['Country Name', '1980', '1990', '2000', '2010', '2018', '2019', '2020']
df_gdp = pd.read_csv(gdp_file, usecols=gdp_columns)

数据集:https://www.kaggle.com/zackerym/gdp-annual-growth-for-each-country-1960-2020

调用drop时,需要传递行索引或列名。你可以给它一个面具,这基本上就是你在做什么。

试试这个:

gdp_2019_outliers = np.where(df_gdp['2019'] > 6)
df_gdp.drop(gdp_2019_outliers[0], inplace=True)
gdp_2019_outliers_neg = np.where(df_gdp['2019'] < -3)
# Use this line instead:
df_gdp = df_gdp[~gdp_2019_outliers_neg[0]]


gdp_2020_outliers = np.where(df_gdp['2020'] > 3)
df_gdp.drop(gdp_2020_outliers[0], inplace=True)
gdp_2020_outliers_neg = np.where(df_gdp['2020'] < -15)
# Use this line instead as well:
df_gdp = [~gdp_2020_outliers_neg[0]]

让我们将源 DataFrame 创建为:

   2019  2020
0     5     2
1     6     7
2     7   -15
3     8     8
4    -4     5
5    -3   -18
6    -2     7
7    -5    -3

到目前为止索引包含连续的整数,从0开始。

当你计算gdp_2019_outliers时,结果是:

(array([2, 3], dtype=int64),)

并且在第一滴之后 df_gdp 包含:

   2019  2020
0     5     2
1     6     7
4    -4     5
5    -3   -18
6    -2     7
7    -5    -3

到目前为止你的代码是成功的,因为行的整数索引只是 与 df_gdp.

的索引相同

然后,当你计算gdp_2019_outliers_neg时,结果是:

(array([2, 5], dtype=int64),)

现在,当你尝试 运行:

df_gdp.drop(gdp_2019_outliers_neg[0], inplace=True)

抛出异常:

KeyError: '[2] not found in axis'

您的代码失败的原因是:

  • np.where 找到找到的行的 integer 索引, 再次从 0 开始并且不对应于 indexdf_gdp,
  • 然后 drop 尝试查找仅包含这些值的行 在索引中并且这个索引不包含2.

正确的代码应该是使用 布尔索引:

gdp_2019_outliers = df_gdp['2019'] > 6
df_gdp = df_gdp[~gdp_2019_outliers]

然后,删除 2019、运行:

的负异常值
gdp_2019_outliers_neg = df_gdp['2019'] < -3
df_gdp = df_gdp[~gdp_2019_outliers_neg]

两次下降后的结果是:

   2019  2020
0     5     2
1     6     7
5    -3   -18
6    -2     7

以相同的方式删除其他异常值。