首页 > 解决方案 > 如果两列单元格为空,如何删除行?

问题描述

这是我的DF

A  B  C
1  10 10
2  
3  12 12
4      
5  21 22

我想比较列 B 和 C 然后我必须检查两者是否为空,然后我想从 DF 中删除这些行。

输出看起来像,这个

A  B  C
1  10 10
3  12 12     
5  21 22

然后我需要再次检查 B 和 C 的两列,比如值是否相同,如果相同,我需要创建一列,说 validation_results 并打印 Y,如果不同,则打印 N。

A  B  C  Validation_Results
1  10 10  Y
3  12 12  Y  
5  21 22  N

我是 python 新手,所以这里的任何人都告诉我如何用最少的代码行来做到这一点。

标签: pythonpandasnumpydataframe

解决方案


如果没有值是缺失值的解决方案:

DataFrame.dropnaDataFrame.assign创建的新列一起使用numpy.where

print (df)
   A     B     C
0  1  10.0  10.0
1  2   NaN   NaN
2  3  12.0  12.0
3  4   NaN   NaN
4  5  21.0  22.0

df1 = (df.dropna(subset=['B','C'], how='all')
         .assign(Validation_Results = lambda x: np.where(x.B==x.C, 'Y', 'N')))
print (df1)
   A     B     C Validation_Results
0  1  10.0  10.0                  Y
2  3  12.0  12.0                  Y
4  5  21.0  22.0                  N

如果没有值是空字符串的解决方案:

print (df)
   A   B   C
0  1  10  10
1  2        
2  3  12  12
3  4        
4  5  21  22

df1 = (df[df[['B','C']].ne('').all(axis=1)]
         .assign(Validation_Results = lambda x: np.where(x.B==x.C, 'Y', 'N')))
print (df1)
   A   B   C Validation_Results
0  1  10  10                  Y
2  3  12  12                  Y
4  5  21  22                  N

详情

首先比较两列DataFrame.ne是否不相等''- 空字符串:

print (df[['B','C']].ne(''))
       B      C
0   True   True
1  False  False
2   True   True
3  False  False
4   True   True

然后测试 row 中的两个值是否都是Trues by DataFrame.all

print (df[['B','C']].ne('').all(axis=1))
0     True
1    False
2     True
3    False
4     True
dtype: bool

并通过以下方式过滤它们boolean indexing

print (df[df[['B','C']].ne('').all(axis=1)])
   A   B   C
0  1  10  10
2  3  12  12
4  5  21  22

推荐阅读