当我在模块"熊猫"中使用drop()函数时出现索引错误



在此处输入图像描述

下面的代码是我编码的:

import pandas as pd
import numpy as np
df = pd.DataFrame([[0, np.nan, 3], [0, 4, 1], [10, 20, 30]],
columns=['A', 'B', 'C'])

for i in range(len(df)):
if df.iloc[i,:].notna().to_list().count(False)>=1:
df.drop([i],inplace=True)

错误如下:IndexError:单个位置索引器超出的范围

当前代码的问题

以下是循环迭代时发生的情况。

运行循环之前

df是:

A     B   C
0   0   NaN   3
1   0   4.0   1
2  10  20.0  30

循环的第一行是for i in range(len(df)len(df)是3,所以range(len(df)[0, 1, 2],循环内的代码将针对i的这三个值中的每一个执行。

i=0

df.iloc[0,:]是:

0   NaN   3

它包含一个na值,因此它被删除。

df现在是:

A     B   C
1   0   4.0   1
2  10  20.0  30

i=1

df.iloc[1,:]为:

10  20.0  30

此行不包含na值,因此不会将其删除请注意,从未选中包含0、4.0、1的行

df仍然是:

A     B   C
1   0   4.0   1
2  10  20.0  30

i=2

df只有两行,01,所以df.iloc[2,:]不存在。这就是IndexError发生的地方。

上面的行为就是为什么在迭代对象时永远不应该删除对象的元素。这适用于列表和panda数据帧。一般来说,对panda数据帧进行迭代通常不是一个好主意,因为它们提供了一系列方法,可以以更稳定、更高效的方式完成几乎所有需要做的事情。

你应该做什么

pandas.DataFrame.dropna

df.dropna(inplace=True)

最新更新