Python Pandas中基于两列缺失值状态生成标记列的实现咨询
解决Pandas DataFrame生成缺失值状态列的问题
嘿,作为Pandas新手遇到这种需求太正常了,我来帮你一步步实现!咱们先从你的输入数据开始,一步步生成你想要的第三列。
首先,先把你的初始代码写出来(记得要导入pandas和numpy哦):
import pandas as pd import numpy as np d = {'First': ['','','A','B','B','C'], 'Second': ['12', '', '10', '', '', '11']} df = pd.DataFrame(data = d)
接下来,咱们需要根据两列的空值情况定义对应的状态。这里用numpy.select()会非常高效,它能根据多个条件匹配对应的结果。
步骤1:定义判断条件和对应结果
咱们先梳理四种情况,分别对应你想要的状态:
- 两列都为空字符串 →
missing - 仅First列有值(Second为空) →
Firstfilled - 仅Second列有值(First为空) →
Secondfilled - 两列都有值 →
bothfilled
把这些条件和结果写成列表:
# 定义条件列表 conditions = [ (df['First'] == '') & (df['Second'] == ''), (df['First'] != '') & (df['Second'] == ''), (df['First'] == '') & (df['Second'] != ''), (df['First'] != '') & (df['Second'] != '') ] # 对应每个条件的结果 results = [ 'missing', 'Firstfilled', 'Secondfilled', 'bothfilled' ]
步骤2:生成第三列
用np.select()把条件和结果关联起来,直接生成第三列:
df['Third'] = np.select(conditions, results)
验证结果
运行完上面的代码后,你的DataFrame就会变成你期望的样子:
First Second Third 0 12 Secondfilled 1 missing 2 A 10 bothfilled 3 B Firstfilled 4 B Firstfilled 5 C 11 bothfilled
补充说明:如果缺失值是NaN的情况
如果你的数据里的缺失值是真正的NaN(而不是空字符串),只需要把判断条件里的== ''改成pd.isna(),!= ''改成~pd.isna()就可以了,比如:
# 假设DataFrame里的缺失值是NaN d = {'First': [np.nan, np.nan, 'A','B','B','C'], 'Second': ['12', np.nan, '10', np.nan, np.nan, '11']} df = pd.DataFrame(data = d) # 调整后的条件 conditions = [ pd.isna(df['First']) & pd.isna(df['Second']), ~pd.isna(df['First']) & pd.isna(df['Second']), pd.isna(df['First']) & ~pd.isna(df['Second']), ~pd.isna(df['First']) & ~pd.isna(df['Second']) ] df['Third'] = np.select(conditions, results)
这样同样能得到正确的状态标记~
内容的提问来源于stack exchange,提问作者Panic_Picnic
相关产品推荐
相关产品推荐

