用DataFrame布尔索引的方法删除特定行或列

对于pandas DataFrame对象通常用“df.drop()”方法或关键字del删去行或列,但drop和del操作都必须先要知道想删除的确切列名或索引。如果只知道想要删去符合某个条件的行或列,必须先把这些行列的索引号找出来放到一个列表里,再代入到drop或del代码语句里执行删除操作,比较麻烦。其实有个简单好用的技巧,就是利用布尔索引来提取想要保存的内容,赋值给自己,自然就删去了想要删的内容,像过滤一样。删除操作的基本格式是:
df=df[逻辑表达式取反]

以下面的表格为例,定义其为DataFrame对象df:

index A B C D E
0 2 6 9 2 3
1 3 NaN 3 0 1
2 5 6 6 NaN 9
3 9 0 6 0 7
4 9 NaN 8 5 3
5 7 9 4 3 2
6 6 1 7 1 NaN

(1)删去满足条件的行
删去B列大于7或D列为0的行,也就是要保留B列小于等于7且D列不为0的行

df=df[~((df['B']>7)|(df['D']==0))]
print(df)

以上代码跟下面的代码效果一样,上面逻辑表达式取了反,下面没取反

df=df[(df['B']<=7)&(df['D']!=0)]
print(df)

结果是:

index A B C D E
0 2 6 9 2 3
2 5 6 6 NaN 9
6 6 1 7 1 NaN

又如,删去E列取值为2或7的行

df=df[~df['E'].isin([2,7])]
print(df)

结果为:

index A B C D E
0 2 6 9 2 3
1 3 NaN 3 0 1
2 5 6 6 NaN 9
4 9 NaN 8 5 3
6 6 1 7 1 NaN

(2)删去满足条件的列
删去第3行取值是偶数的列

df=df.loc[:,~(df.iloc[3,:]%2==0)]
print(df)

结果是:

index A E
0 2 3
1 3 1
2 5 9
3 9 7
4 9 3
5 7 2
6 6 NaN

(3)删去含有缺失值的行
相当于dropna()

df=df[~df.isnull().any(axis=1)]
print(df)

结果是:

扫描二维码关注公众号,回复: 2822245 查看本文章
index A B C D E
0 2 6 9 2 3
3 9 0 6 0 7
5 7 9 4 3 2

(4)删去含有缺失值的列

df=df.loc[:,~df.isnull().any()]
print(df)

结果是:

index A C
0 2 9
1 3 3
2 5 6
3 9 6
4 9 8
5 7 4
6 6 7

(5)删去整个表格中满足条件的行
删去整个表格中所有数值“6”所在的行

df=df.loc[~df.where(df==6).any(axis=1)]
print(df)

结果是:

index A B C D E
1 3 NaN 3 0 1
4 9 NaN 8 5 3
5 7 9 4 3 2

上面的操作如果改为对列删除,则代码改为:

df=df.loc[:,~df.where(df==6).any()]

猜你喜欢

转载自blog.csdn.net/sigtem/article/details/81735242