首页 > 解决方案 > 如何删除由“̶i̶s̶i̶n̶(̶)̶”df.mask()找到的单元格和剪切行?

问题描述

我有带有随机单元格的数据框,例如“老板”。如何使用 df.isin() 删除同一行中的单元格“boss”和所有正确的单元格?

x=[]
for i in range (5):
    x.append("boss")
df=pd.DataFrame(np.diagflat(x) ) 

      0     1     2     3     4
0  boss                        
1        boss                  
2              boss            
3                    boss      
4                          boss

使用“i̶s̶i̶n̶(̶)̶” df.mask 将行剪切到

mask=(df.eq('boss').cumsum(axis=1).ne(0))
df.mask(mask,"Nan", inplace =True)

df
     0    1    2    3    4
0  NaN  NaN  NaN  NaN  NaN          
1       NaN  NaN  NaN  NaN
2            NaN  NaN  NaN  
3                 NaN  NaN 
4                      NaN

标签: pythonpandasdataframe

解决方案


DataFrame.mask与面膜一起使用:

df = df.mask(df.eq('boss').cumsum(axis=1).ne(0))
print (df)
     0    1    2    3    4
0  NaN  NaN  NaN  NaN  NaN
1       NaN  NaN  NaN  NaN
2            NaN  NaN  NaN
3                 NaN  NaN
4                      NaN

细节:

比较值boss

print (df.eq('boss'))
       0      1      2      3      4
0   True  False  False  False  False
1  False   True  False  False  False
2  False  False   True  False  False
3  False  False  False   True  False
4  False  False  False  False   True

使用每行的累积总和,所以在第一次匹配1之后,在第二次之后2..:

print (df.eq('boss').cumsum(axis=1))
   0  1  2  3  4
0  1  1  1  1  1
1  0  1  1  1  1
2  0  0  1  1  1
3  0  0  0  1  1
4  0  0  0  0  1

如果不相等则比较0并传递给mask

print (df.eq('boss').cumsum(axis=1).ne(0))
       0      1      2      3     4
0   True   True   True   True  True
1  False   True   True   True  True
2  False  False   True   True  True
3  False  False  False   True  True
4  False  False  False  False  True

推荐阅读