如何在Pandas DataFrame的每行中找到第三个NaN值所在的列?
如何在Pandas DataFrame的每行中找到第三个NaN值所在的列?
我明白你的问题啦——你现在需要定位每行里第三个NaN值对应的列标签,但原来用idxmax()的方法只能返回第一个出现NaN的列,所以才会得到不符合预期的结果。下面给你两种可行的解法,还会帮你解释其中的逻辑:
方法一:使用apply结合布尔筛选(直观易懂)
这种方法思路非常直接,对每行先筛选出所有NaN的位置,再取第三个对应的列名:
result = df.apply(lambda row: row[row.isna()].index[2], axis=1) print(result)
逻辑拆解:
row.isna():对当前行生成一个布尔序列,标记哪些位置是NaNrow[row.isna()]:筛选出该行所有值为NaN的元素,得到一个仅包含NaN的子Series.index[2]:这个子Series的索引就是NaN对应的列名,取索引为2的元素(因为Python是0索引,第三个元素对应索引2)
运行后会得到你想要的结果:
0 e 1 c 2 d 3 h 4 d dtype: object
方法二:向量化操作(高效,适合大数据集)
如果你的DataFrame行数很多,apply的效率可能不够高,推荐用向量化的方式实现,性能会好很多:
# 计算每行NaN的累积计数,找到计数为3的位置,再取对应的列名 nan_positions = df.isna().cumsum(axis=1).eq(3).idxmax(axis=1) print(nan_positions)
逻辑拆解:
df.isna():生成和原DataFrame同形状的布尔矩阵,NaN位置为Truecumsum(axis=1):对每行做累加,这样每行的NaN位置会依次被标记为1、2、3、4、5(对应第1到第5个NaN).eq(3):将累加后等于3的位置标记为True(也就是第三个NaN的位置)idxmax(axis=1):找到每行第一个True的位置,也就是第三个NaN对应的列名
为什么原来的解法不对?
你之前用的row.isna().idxmax(),是返回该行中第一个True值的索引——也就是第一个NaN的列名,这和题目要求的“第三个NaN”完全不符,所以才会得到错误的结果。
备注:内容来源于stack exchange,提问作者Pratyush
相关产品推荐
相关产品推荐

