python - 如果两列单元格为空,如何删除行?
问题描述
这是我的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 新手,所以这里的任何人都告诉我如何用最少的代码行来做到这一点。
解决方案
如果没有值是缺失值的解决方案:
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
然后测试 row 中的两个值是否都是True
s 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
推荐阅读
- python - Snakemake 在循环中使用规则
- sql - 对表的列求和,按表分区分组
- emacs - 如何正确使用 org-capture 的功能选项?
- r - R中的分组ggplot箱线图
- vb.net - 如何在“DataColumn.Expression”中正确定义 Like-Operator (VisualBasic) 的模式以及 lambda 的使用?
- java - 如何在 Spring Boot 中修复此 JSON 解析错误?
- python - 尝试使用 plt.subplot 一起绘制多个条形图
- configuration - HAProxy - 透明地重写 URL
- ios - 数据为 NULL 时访问链表的数据元素时应用程序崩溃
- python - 为什么 django 1.4 中的自动提交会减慢单元测试的速度?