如何解决最长NaN批次的返回指数
我有一个按两列排序的数据框:“ ID”和日期列。
该表中有大量的缺失值,我感兴趣的是了解缺失值的分布方式:它们主要集中在一个“ ID”上吗,例如,所有ID的开头都有缺失值吗? ),缺少的值不相关等。
在使用groupby ID +缺失值计数之后,我使用了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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。