如何仅删除barcode_x与barcode_y不等的行(保留NaN/空值行)
如何筛选保留barcode_x与barcode_y相等或含空值的行?
看起来你需要保留两类行:一类是barcode_x和barcode_y取值完全相等的,另一类是这两个字段里包含NaN或空值的行,同时删掉那些两个字段都非空但取值不等的行。用Python的Pandas库可以轻松实现这个需求,下面是具体步骤:
原始数据处理
先把你给出的原始数据转换成Pandas DataFrame:
import pandas as pd import numpy as np # 构造原始数据 data = { 'id': [7068, 7068, 7068, 7116, 7154, 7342], 'barcode_x': [38927887, 38927895, 39111141, 73094237, 37645215, 86972909], 'barcode_y': [38927895, 38927895, 38927895, 18, 37645215, np.nan], 'A': [0, 0, 0, 3, 0, 7], 'B': [12, 1, 4, 309, 9, 25] } df = pd.DataFrame(data)
核心筛选代码
通过组合逻辑条件就能筛选出符合要求的行:
# 筛选条件:两个barcode相等,或者至少一个字段为NaN/空值 filtered_df = df[(df['barcode_x'] == df['barcode_y']) | df['barcode_x'].isna() | df['barcode_y'].isna()]
代码逻辑解释
df['barcode_x'] == df['barcode_y']:匹配barcode_x和barcode_y取值完全一致的行(比如示例中的行1、行4)df['barcode_x'].isna():匹配barcode_x为缺失值的行df['barcode_y'].isna():匹配barcode_y为缺失值的行(比如示例中的行5)- 用
|(逻辑或)将这些条件串联,就能自动排除两个字段都非空但取值不等的行(比如示例中的行0、行2)
运行结果
执行上述代码后,filtered_df的输出和你期望的结果完全一致:
id barcode_x barcode_y A B 1 7068 38927895 38927895 0 1 3 7116 73094237 18 3 309 4 7154 37645215 37645215 0 9 5 7342 86972909 NaN 7 25
补充说明
如果你的数据中存在字符串类型的空值(比如""),而不是NaN,可以把条件扩展为:
filtered_df = df[(df['barcode_x'] == df['barcode_y']) | df['barcode_x'].isna() | df['barcode_y'].isna() | (df['barcode_x'] == "") | (df['barcode_y'] == "")]
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

