如何在无NaN的Pandas索引中查找各日期缺失的指定Name值?
查找Pandas日期索引下缺失的Name值
场景说明
现有一个以Date为索引的DataFrame,包含Name和Payment列(Payment无空值),已知所有可能的Name列表,需要找出每个日期索引下缺失的具体Name值。
示例数据:
import pandas as pd data = [['2010-01-01', 'Patrick', 20],['2010-01-02', 'James', 20]] df = pd.DataFrame(data, columns=['Date', 'Name', 'Payment']).set_index('Date') poss_names = ['James', 'Patrick']
期望输出:[['2010-01-01', 'James'], ['2010-01-02', 'Patrick']]
方法一:分组对比Name集合
通过分组获取每个日期已有的Name,再与总列表对比找出缺失值:
# 按日期索引分组,收集每个日期的Name列表 date_names = df.groupby(level=0)['Name'].apply(list) # 生成缺失记录列表 missing_records = [ [date, name] for date, existing in date_names.items() for name in poss_names if name not in existing ] print(missing_records)
方法二:透视表结合空值判断
利用透视表生成每个日期对应所有Name的结构,缺失的Name会对应空值,以此定位缺失项:
# 生成透视表,缺失Name的位置会显示NaN pivot_table = df.pivot(columns='Name', values='Payment') # 遍历每行,找出空值对应的Name missing_records = [] for date, row in pivot_table.iterrows(): missing_names = row[row.isna()].index.tolist() for name in missing_names: missing_records.append([date, name]) print(missing_records)
两种方法都能得到符合预期的结果,可根据数据规模选择:分组对比适合小规模数据,透视表法逻辑更直观,适合需要后续分析缺失情况的场景。
内容的提问来源于stack exchange,提问作者StormsEdge
相关产品推荐
相关产品推荐

