python - Pandas 数据框中按键列分组的连续空值的计数

标签 python pandas dataframe pandas-groupby

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

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

我试图找出 CODE 中每个值的 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

理论上,count(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

我该如何解决这个问题?提前致谢

最佳答案

您可以使用:

首先测试是否匹配缺失值:

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

关于python - Pandas 数据框中按键列分组的连续空值的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66684740/

相关文章:

python - 从 pd.read_sql 输出附加到 Pandas Dataframe

python - 我应该在 Windows 7 中使用 Python 2.7 32 位还是 64 位

python - 如何按特定顺序对两个(或更多)不同列上的 pandas 数据框进行排序

postgresql - 将字符串转换为 BigInt 数据框 spark scala

python - 如何用 pandas 读取大型 csv?

python - 测量 Keras 层执行时间的正确方法

python - pandas str.contains 匹配多个字符串并获取匹配的值

python - 清理一列字符串并添加新列的更有效方法

python - 循环转置和连接数据帧列表

python - 如何使用pandas python根据给定的IP地址将大型excel文件拆分为多个工作表