如何在Pandas中仅为IsB非空的记录设置IsA列?
解决Pandas中根据IsB列非空情况设置IsA列的问题
嗨,这问题我熟!你现在的代码没考虑IsB为空的场景,不管IsB有没有值都会生成布尔结果,所以才会出现像ID3那条记录不符合预期的情况。咱们调整下代码,就能完美实现你要的逻辑:当IsB非空时计算IsA的值,IsB为空时让IsA也保持为空。
方法一:用np.where实现条件赋值
np.where可以帮咱们分情况处理,先判断IsB是否非空,再对应赋值:
import numpy as np import pandas as pd # 先把示例数据转成Pandas能识别的格式 data = pd.DataFrame({ 'ID': [1, 2, 3], 'IsB': [1, 1, np.nan], 'IsC': [0, 0, 0], 'IsD': [1, 0, 0], 'IsE': [0, 0, 0] }) # 设置IsA列 data['IsA'] = np.where( data['IsB'].notna(), # 核心条件:IsB非空 # 满足条件时的计算逻辑 (data['IsB'] == True) & (data['IsC'] == False) & (data['IsD'] == False) & (data['IsE'] == False), np.nan # IsB为空时赋值为nan ) # 如果需要把布尔值转成0/1(和你的示例格式一致),用Int64类型保留空值 data['IsA'] = data['IsA'].astype('Int64')
运行后数据会变成:
| ID | IsA | IsB | IsC | IsD | IsE |
|---|---|---|---|---|---|
| 1 | 0 | 1.0 | 0 | 1 | 0 |
| 2 | 1 | 1.0 | 0 | 0 | 0 |
| 3 | NaN | 0 | 0 | 0 |
方法二:用mask方法快速遮罩空值场景
先计算所有行的IsA结果,再把IsB为空的行遮罩成空值,代码更简洁:
# 先计算所有行的布尔判断结果 is_a_condition = (data['IsB'] == True) & (data['IsC'] == False) & (data['IsD'] == False) & (data['IsE'] == False) # 把IsB为空的行的IsA设为空 data['IsA'] = is_a_condition.mask(data['IsB'].isna()).astype('Int64')
特殊情况处理
如果你的数据里的<null>是字符串类型(而非Pandas默认的NaN),那判断条件要改成data['IsB'] != '<null>',示例如下:
data['IsA'] = np.where( data['IsB'] != '<null>', (data['IsB'] == True) & (data['IsC'] == False) & (data['IsD'] == False) & (data['IsE'] == False), '<null>' )
这样就能完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者konichiwa
相关产品推荐
相关产品推荐

