最长NaN批次的返回指数

问题描述

我有一个按两列排序的数据框:“ ID”和日期列。
该表中有大量的缺失值,我感兴趣的是了解缺失值的分布方式:它们主要集中在一个“ ID”上吗,例如,所有ID的开头都有缺失值吗? ),缺少的值不相关等。

在使用groupby ID +缺失值计数之后,我使用了missingno程序包,事实证明它很有用,这是我得到的结果(消毒列名):

missingno

从图片中看,似乎有特定批次的行,其中缺少大多数列。 例如,如果您查看箭头,我可能可以为索引搜索一个值(〜idx = 750000),但这是不切实际的,因为还有其他实例发生相同的情况。
我想要的是一个函数batches_missing(cols,n_rows),该函数接受一个列列表和一个整数n_rows,并返回所有批次的元组[[index_start_batch1,index_end_batch1),...]的列表,其中给定的列具有n_rows个连续的缺失值行。

带有一个模拟示例:

df = pd.DataFrame({'col1':[1,2,np.nan,np.nan],'col2':[9,7,'col3':[11,12,13,1,3,3]})

batches_missing(['col1','col2'],3)将返回[(2,5),(8,10)]

鉴于实际数据非常大(100万行),可以有效地完成此操作吗?我也很想听听其他分析缺失数据的方法,因此希望能阅读任何阅读材料/链接!

谢谢大家。

解决方法

您可以明智地对行进行统计,以查看在给定选定的列的情况下,哪些行均为NA:

rowwise_tally = df[['col1','col2']].isna().apply(all,axis=1)

0     False
1     False
2      True
3      True
4      True
5      True
6     False
7     False
8      True
9      True
10     True

现在您可以将此运行分组:

grp = rowwise_tally.diff().cumsum().fillna(0)
0     0.0
1     0.0
2     1.0
3     1.0
4     1.0
5     1.0
6     2.0
7     2.0
8     3.0
9     3.0
10    3.0

然后计算每组中的nas数量,并获得开始和结束:

na_counts = rowwise_tally.groupby(grp).sum()
pos = pd.Series(np.arange(len(df))).groupby(grp).agg([np.min,np.max])
pos[na_counts>=3].to_numpy()

array([[ 2,5],[ 8,10]])

也许有更好的方法来获得位置,而不是像我一样使用pd.Series。现在,将其包装为一个函数:

def fun(data,cols,minlen):
    rowwise_tally = data[cols].isna().apply(all,axis=1)
    grp = rowwise_tally.diff().cumsum().fillna(0)
    na_counts = rowwise_tally.groupby(grp).sum()
    pos = pd.Series(np.arange(len(data))).groupby(grp).agg([np.min,np.max])
    return pos[na_counts>=minlen].to_numpy()

fun(df,['col1','col2'],3)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...