Python 如何轻松删除熊猫数据框中的特殊行

Python 如何轻松删除熊猫数据框中的特殊行,python,pandas,Python,Pandas,我有一个python中熊猫的数据框架。我想在三种情况下删除该行。首先,第1列到第6列和第10列到第15列在该行中为“NA”。第二,第1列至第3列、第7列至第12列和第16列至第18列为“NA”。第三,第4至9栏和第13至18栏为“NA”。我写了代码来修复它,但它不起作用。 代码如下: data=pd.read\u csv('data(2.txt',sep=“\t”,index\u col='tracking\u id')) num=len(数据)+1 对于范围内的i(num): 如果(data

我有一个python中熊猫的数据框架。我想在三种情况下删除该行。首先,第1列到第6列和第10列到第15列在该行中为“NA”。第二,第1列至第3列、第7列至第12列和第16列至第18列为“NA”。第三,第4至9栏和第13至18栏为“NA”。我写了代码来修复它,但它不起作用。 代码如下:

data=pd.read\u csv('data(2.txt',sep=“\t”,index\u col='tracking\u id'))
num=len(数据)+1
对于范围内的i(num):
如果(data.iloc[i[0:5,9:14]]=='NA')|(data.iloc[i[0:11,15:17]]=='NA)'\
|(data.iloc[i[3:8,12:17]=='NA'):
data=data.drop(data.index[i],axis=0)
您可以使用:

np.random.seed(100)
df = pd.DataFrame(np.random.randint(10, size=(5,18)))

df.iloc[0, np.r_[0:5,9:14]] = np.nan
df.iloc[2, np.r_[0:11,15:17]] = np.nan
df.iloc[3:5, np.r_[3:8,12:17]] = np.nan
print (df)
    0    1    2    3    4    5    6    7    8    9    10   11   12   13   14  \
0  NaN  NaN  NaN  NaN  NaN  0.0  4.0  2.0  5.0  NaN  NaN  NaN  NaN  NaN  8.0   
1  6.0  2.0  4.0  1.0  5.0  3.0  4.0  4.0  3.0  7.0  1.0  1.0  7.0  7.0  0.0   
2  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  2.0  5.0  1.0  8.0   
3  2.0  8.0  3.0  NaN  NaN  NaN  NaN  NaN  3.0  4.0  7.0  6.0  NaN  NaN  NaN   
4  7.0  6.0  6.0  NaN  NaN  NaN  NaN  NaN  6.0  6.0  0.0  7.0  NaN  NaN  NaN   

    15   16  17  
0  4.0  0.0   9  
1  2.0  9.0   9  
2  NaN  NaN   4  
3  NaN  NaN   5  
4  NaN  NaN   4  
首先检查值是否为
NaN
by,然后选择by和并与进行比较,以检查每行的所有值是否为
True
。然后使用
|
(或)构建主掩码

最后一个过滤条件为反向过滤条件为
~

mask = df.isnull()
m1 = mask.iloc[:, np.r_[0:5,9:14]].all(1)
m2 = mask.iloc[:, np.r_[0:11,15:17]].all(1)
m3 = mask.iloc[:, np.r_[3:8,12:17]].all(1)
m = m1 | m2 | m3
print (m)
0     True
1    False
2     True
3     True
4     True
dtype: bool

df = df[~m]
print (df)
    0    1    2    3    4    5    6    7    8    9    10   11   12   13   14  \
1  6.0  2.0  4.0  1.0  5.0  3.0  4.0  4.0  3.0  7.0  1.0  1.0  7.0  7.0  0.0   

    15   16  17  
1  2.0  9.0   9  

很好地使用了
np.r\ucode>@dmitrypoloskiy-谢谢。@FLab-谢谢。我也考虑过,但in-
NA
转换为
NaN
mask = df.isnull()
m1 = mask.iloc[:, np.r_[0:5,9:14]].all(1)
m2 = mask.iloc[:, np.r_[0:11,15:17]].all(1)
m3 = mask.iloc[:, np.r_[3:8,12:17]].all(1)
m = m1 | m2 | m3
print (m)
0     True
1    False
2     True
3     True
4     True
dtype: bool

df = df[~m]
print (df)
    0    1    2    3    4    5    6    7    8    9    10   11   12   13   14  \
1  6.0  2.0  4.0  1.0  5.0  3.0  4.0  4.0  3.0  7.0  1.0  1.0  7.0  7.0  0.0   

    15   16  17  
1  2.0  9.0   9