Pandas按预设规则检查DataFrame指定列空值并打标签实现问题
问题原因
原代码的逻辑问题主要有3点:
- 用
df['City'].any()做判断是对整列取值做校验,而非逐行判断每行的City字段值 df['xxx'].empty是判断整列是否为空,不是判断单个单元格是否为空值- 用的
if-elif-else分支是对整个DataFrame做全局判断,无法实现逐行打标签的需求
修改后完整代码
import pandas as pd data = { 'City': ['london', 'manchester', 'liverpool', 'birmingham'], 'Address': ['A', 'B', 'C', 'D'], 'Address1': ['E', 'F', '', 'H'], 'Postcode': ['', '', 'L1 0AA', 'B23 3AW '] } df = pd.DataFrame(data) # 构造两种不符合要求的判断条件 # 情况1:City为london,且City/Address/Postcode任意字段为空 cond_london_fail = (df['City'] == 'london') & (df[['City', 'Address', 'Postcode']].eq('').any(axis=1)) # 情况2:City不为london,且四个字段任意为空 cond_other_fail = (df['City'] != 'london') & (df[['City', 'Address', 'Address1', 'Postcode']].eq('').any(axis=1)) # 新增Label列,满足失败条件的行赋值为'n',其余为空 df['Label'] = '' df.loc[cond_london_fail | cond_other_fail, 'Label'] = 'n' print(df)
运行输出
City Address Address1 Postcode Label 0 london A E n 1 manchester B F n 2 liverpool C L1 0AA n 3 birmingham D H B23 3AW
和预期输出完全一致,若后续数据中存在NaN类型的空值,把判断条件里的.eq('')替换为.isna()即可适配。
内容的提问来源于stack exchange,提问作者user01
相关产品推荐
相关产品推荐

