在此处输入图像描述
下面的代码是我编码的:
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
只有两行,0
和1
,所以df.iloc[2,:]
不存在。这就是IndexError
发生的地方。
上面的行为就是为什么在迭代对象时永远不应该删除对象的元素。这适用于列表和panda数据帧。一般来说,对panda数据帧进行迭代通常不是一个好主意,因为它们提供了一系列方法,可以以更稳定、更高效的方式完成几乎所有需要做的事情。
你应该做什么
pandas.DataFrame.dropna
df.dropna(inplace=True)