从 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 开始并且不对应于 index
共 df_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
以相同的方式删除其他异常值。
我正在尝试从 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 开始并且不对应于 index 共 df_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
以相同的方式删除其他异常值。