我有这个 df:
CODE DATE TMAX TMIN PP
0 000130 1991-01-01 NaN NaN 0.0
1 000130 1991-01-02 31.2 NaN 0.0
2 000130 1991-01-03 32.0 21.2 0.0
3 000130 1991-01-04 NaN NaN 0.0
4 000130 1991-01-05 NaN 22.0 0.0
... ... ... ... ...
34995 000135 1997-04-24 NaN NaN 0.0
34996 000135 1997-04-25 NaN NaN 4.0
34997 000135 1997-04-26 NaN 22.1 0.0
34998 000135 1997-04-27 31.0 NaN 5.0
34999 000135 1997-04-28 28.8 24.0 0.0
我在 TMAX TMIN 和 PP 列中按 CODE 列计算 NaN 值。所以我正在使用这个代码。
dfna=df[['TMAX','TMIN','PP']].isna().groupby(df.CODE).sum()
但我想从第一个非 NaN 值开始计算 NaN 值。
预期 df:
CODE TMAX TMIN PP
000130 2 1 0
000135 0 1 0
...
...
我该怎么做?
提前致谢。
答案 0 :(得分:2)
从整个框架的角度考虑,您可以使用 ffill
删除后面的 nan 值。因此,您可以使用它来检测第一个有效值之后的 nan:
df.isna() & df.ffill().notna()
现在,您可以尝试groupby.apply
(df[['TMAX','TMIN','PP']].groupby(df['CODE'])
.apply(lambda d: (d.isna() & d.ffill().notna()).sum())
)
输出:
TMAX TMIN PP
CODE
130 2 1 0
135 0 1 0