我想在 numpy 数组或最好是 pandas DataFrame 中找到相同值块的开始和停止索引(二维数组沿列的块,以及一维数组沿最快变化的索引的块)。我只在一个维度上寻找块,不想在不同的行上聚合 nans。
从那个问题开始(在 numpy 数组中查找满足条件的大量连续值),我编写了以下解决方案,为 2D 数组查找 np.nan:
import numpy as np
a = np.array([
[1, np.nan, np.nan, 2],
[np.nan, 1, np.nan, 3],
[np.nan, np.nan, np.nan, np.nan]
])
nan_mask = np.isnan(a)
start_nans_mask = np.hstack((np.resize(nan_mask[:,0],(a.shape[0],1)),
np.logical_and(np.logical_not(nan_mask[:,:-1]), nan_mask[:,1:])
))
stop_nans_mask = np.hstack((np.logical_and(nan_mask[:,:-1], np.logical_not(nan_mask[:,1:])),
np.resize(nan_mask[:,-1], (a.shape[0],1))
))
start_row_idx,start_col_idx = np.where(start_nans_mask)
stop_row_idx,stop_col_idx = np.where(stop_nans_mask)
例如,这让我可以在应用 pd.fillna 之前分析缺失值补丁的长度分布。
stop_col_idx - start_col_idx + 1
array([2, 1, 1, 4], dtype=int64)
再举一个例子和预期的结果:
a = np.array([
[1, np.nan, np.nan, 2],
[np.nan, 1, np.nan, np.nan],
[np.nan, np.nan, np.nan, np.nan]
])
array([2, 1, 2, 4], dtype=int64)
并不是
array([2, 1, 6], dtype=int64)
我的问题如下:
- 有没有办法优化我的解决方案(在一次掩码/where 操作中查找开始和结束)?
- pandas 中是否有更优化的解决方案?(即与仅在 DataFrame 的值上应用掩码/位置不同的解决方案)
- 当底层数组或 DataFrame 太大而无法放入内存时会发生什么?