【问题标题】:Python Pandas: Get number of NaN before first non NaN valuePython Pandas:在第一个非 NaN 值之前获取 NaN 的数量
【发布时间】:2022-02-14 20:33:07
【问题描述】:

我有以下数据框:

y
NaN
NaN
5
NaN
7

我想编写一个函数,它会在第一个非 NaN 值之前返回 NaN 值的数量。给定上面的例子,函数应该返回值 2。

我尝试使用this question 解决我的问题,但对我没有多大帮助。

编辑:值总是以 NaN 开头。如果列全部为 NaN,则函数应返回列长度。

【问题讨论】:

  • 总是以NaN 开头的值?如果列中的所有值都是NaNs,那么它是计数吗?

标签: python pandas dataframe


【解决方案1】:

您可以使用isna 在 NaN 值上获得 True/1,并使用 cumprod 去除所有跟随非 NaN 的值。然后sum

df['y'].isna().cumprod().sum()

输出:2

【讨论】:

  • 工作如果总是启动NaNs
  • @jezrael 如果首先有一个非 NaN,它会起作用,它将返回 0 ;)
  • 是的,这取决于 OP 需要什么。如果需要先计算 NaNs 岛与否。
【解决方案2】:

您可以使用first_valid_index

df.y.first_valid_index()
> 2

这会获取第一个非 NaN 值的索引。默认情况下,如果索引从NaN 开始,我们不需要求和。

【讨论】:

  • 那你需要先reset_index保证有范围索引;)
  • 取决于索引是什么,OP没有说明他们是否有除0-n以外的其他东西@
  • 是的,它是默认的 df 索引。当然,我想保持原样。
【解决方案3】:

Series.isnaSeries.cummin 一起使用,并按sum 计算Trues:

s = df['y'].isna().cummin().sum()
print (s)
2

【讨论】:

  • df['y'].isna().cummin().sum() :p 当你更新你的答案时,我实际上正要更新我的答案,所以不要添加它与你的答案不同;)
  • @mozway - 是的,它更简单
猜你喜欢
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2017-09-16
相关资源
最近更新 更多