如果两列单元为空,如何删除行?

时间:2019-12-10 11:35:36

标签: python pandas numpy dataframe

这是我的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的两列,例如值是否相同,如果相同,则需要创建一列并说是validate_results并打印Y,如果不相同则打印N。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

然后测试DataFrame.all中行中的两个值是否都是True

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