如何为Pandas DataFrame每行生成缺失值列汇总
嘿,这里有两种实用的方法帮你给Pandas DataFrame添加汇总缺失值列名的summary列,直接上代码和细节解释:
方法一:简洁的apply写法(适合小数据集)
先构造你的示例DataFrame,然后一行代码搞定列的生成:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'a': [pd.NA, pd.NA, pd.NA, 15.0, 5.0], 'b': [2.0, 9.0, pd.NA, 15.0, pd.NA], 'c': [165.0, pd.NA, pd.NA, pd.NA, 11.0] }) # 生成summary列:遍历每行,收集缺失值的列名并用' + '拼接 df['summary'] = df.apply( lambda row: ' + '.join(col for col, val in row.items() if pd.isna(val)), axis=1 )
方法二:向量化操作(更高效,推荐大数据集)
如果你的数据集行数很多,apply的逐行循环会有点慢,试试这个向量化的方案:
# 先得到标记缺失值的布尔矩阵 na_mask = df.isna() # 按行筛选出对应为True的列名,再拼接 df['summary'] = na_mask.apply(lambda x: ' + '.join(na_mask.columns[x]), axis=1)
运行结果
不管用哪种方法,最终都会得到你想要的结果:
| a | b | c | summary | |
|---|---|---|---|---|
| 0 | NaN | 2.0 | 165.0 | a |
| 1 | NaN | 9.0 | NaN | a + c |
| 2 | NaN | NaN | NaN | a + b + c |
| 3 | 15.0 | 15.0 | NaN | c |
| 4 | 5.0 | NaN | 11.0 | b |
简单解释
df.isna():生成一个和原DataFrame结构一样的布尔表,每个单元格标记对应值是不是NaN。axis=1:告诉apply我们要按行来处理数据,而不是默认的按列。- 方法二的核心是先拿到所有缺失值的标记,再直接提取对应列名,避免了逐元素遍历,速度会快很多。
内容的提问来源于stack exchange,提问作者rafat.ch
相关产品推荐
相关产品推荐

