这是我的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的新手,所以这里的任何人都告诉我如何用最少的代码行做到这一点。
答案 0 :(得分:1)
如果没有值缺少值的解决方案:
将DataFrame.dropna
与DataFrame.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