数据帧中按键列分组的连续空值计数

2024-09-29 21:56:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据集(年度数据)如下所示

CODE        Date        PRCP    TAVG        TMAX        TMIN
AE000041196 01-01-2020  0       21.1        
AE000041196 02-01-2020  0       21.4        
AE000041196 03-01-2020  0       21.2                    15.4
AE000041196 04-01-2020  0       21.9                    14.9
AE000041196 05-01-2020  0       23.7                    16.5
AE000041196 06-01-2020  0.5     20.7        
AE000041196 07-01-2020  0       18.1                    11.5
AE000041196 08-01-2020  0       19.6                    10.3
AE000041196 09-01-2020  0.3     20.6                    13.8

我试图找出代码中每个值的TMAX和TMIN列的最长连续缺失值[每个'CODE'的最大连续NaN计数]。例如,从上面有限的数据集:
TMAX的最大连续缺失值为9,TMIN的最大连续缺失值为2

我正在使用的代码

df['TMAX_nullccount'] = df.TMAX.isnull().astype(int).groupby(df['TMAX'].notnull().astype(int).cumsum()).cumsum()

这会导致数据集中出现错误

CODE        Date        PRCP  TAVG  TMAX TMIN   TMAX_nullccount
CA1AB000014 10-03-2021  2.3                     297
CA1AB000014 11-03-2021  0                       298
CA1AB000014 12-03-2021  0                       299
CA1AB000014 13-03-2021  0                       300
CA1AB000014 14-03-2021  0                       301
CA1AB000015 01-01-2021  0                       302
CA1AB000015 02-01-2021  0                       303
CA1AB000015 03-01-2021  0                       304
CA1AB000015 04-01-2021  0                       305

理论上,计数(TMAX_nullcount)应该再次从0开始,代码从CA1AB000014更改为CA1AB000015。另外,列TMAX_nullcount中的值不能超过365(年度数据集),但我的代码给出的值远不止这些

预期输出文件(值已组成)

CODE            TMAX_maxcnullcount  TMIN_maxcnullcount  TAVG_maxcnullcount
AE000041196             2               2                       0
AEM00041194             1               1                       0
AEM00041217             3               1                       0
AEM00041218             1               2                       45
AFM00040938             65              65                      0
AFM00040948             132             132                     0
AG000060390             155             141                     0

我怎样才能解决这个问题?提前谢谢


Tags: 数据代码dfdatecode计数年度tmax
2条回答

您可以使用:

第一次测试是否匹配缺少的值:

print (df.isna())
    CODE   Date   PRCP   TAVG  TMAX   TMIN
0  False  False  False  False  True   True
1  False  False  False  False  True   True
2  False  False  False  False  True  False
3  False  False  False  False  True  False
4  False  False  False  False  True  False
5  False  False  False  False  True   True
6  False  False  False  False  True  False
7  False  False  False  False  True  False
8  False  False  False  False  True  False

#columsn for test missing values 
cols = ['TMAX','TMIN','TAVG']
#CODe to index, filter columns and create one Series
m = df.set_index('CODE')[cols].isna().unstack()

#create consecutive groups and count them with maximal count per column and group
df = (m.ne(m.shift()).cumsum()
       .where(m)
       .groupby(level=[0,1]).value_counts()
       .max(level=[0,1])
       .unstack(0)
       .add_suffix('_maxcnullcount'))
print (df)
             TMAX_maxcnullcount  TMIN_maxcnullcount
CODE                                               
AE000041196                   9                   2

您可以尝试以下方法:

df.groupby(['CODE', df['PRCP'].ne(df['PRCP'].shift()).cumsum()]).size().max()

groupby乘以CODE和连续的零,然后计算大小

您的分组结果(aggr->;大小)将是:

CODE         PRCP
AE000041196  1       5
             2       1
             3       2
             4       1

现在你可以找到max和min

因此,您的最终解决方案将如下所示:

df1 = df.fillna(0)
df1.groupby(['CODE', df1['TMAX'].ne(df1['TMAX'].shift()).cumsum()]).size().max()

9

相关问题 更多 >

    热门问题