NaN最长批次的返回索引

2024-10-01 10:12:17 发布

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

我有一个按两列排序的数据框:“ID”和一个日期列。
该表中有大量缺失值,我感兴趣的是了解缺失值是如何分布的:它们是否主要集中在一个“ID”上,所有ID是否在开始时都有缺失值,例如(日期),缺失值是否无关等

在groupby ID+缺失值计数之后,我使用了missingno包,它被证明是有用的,这是我得到的结果(清理列名):missingno

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

通过一个模拟示例:

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

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

考虑到实际数据相当大(1百万行),这能有效地做到吗?我也非常有兴趣了解分析缺失数据的其他方法,因此非常感谢阅读材料/链接

谢谢大家


Tags: 数据id列表index排序npbatchesnan
1条回答
网友
1楼 · 发布于 2024-10-01 10:12:17

在给定选定列的情况下,按行计数以查看哪些行都是NAs:

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)

相关问题 更多 >