You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

逻辑拆解:

  1. row.isna():对当前行生成一个布尔序列,标记哪些位置是NaN
  2. row[row.isna()]:筛选出该行所有值为NaN的元素,得到一个仅包含NaN的子Series
  3. .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)

逻辑拆解:

  1. df.isna():生成和原DataFrame同形状的布尔矩阵,NaN位置为True
  2. cumsum(axis=1):对每行做累加,这样每行的NaN位置会依次被标记为1、2、3、4、5(对应第1到第5个NaN)
  3. .eq(3):将累加后等于3的位置标记为True(也就是第三个NaN的位置)
  4. idxmax(axis=1):找到每行第一个True的位置,也就是第三个NaN对应的列名

为什么原来的解法不对?

你之前用的row.isna().idxmax(),是返回该行中第一个True值的索引——也就是第一个NaN的列名,这和题目要求的“第三个NaN”完全不符,所以才会得到错误的结果。


备注:内容来源于stack exchange,提问作者Pratyush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:53:07