【发布时间】:2013-02-10 07:34:13
【问题描述】:
我想在 numpy 数组或最好是 pandas DataFrame 中找到相同值块的开始和停止索引(二维数组沿列的块,以及 n 维数组沿最快变化的索引的块)。我只在单个维度上查找块,不想在不同的行上聚合 nans。
从那个问题 (Find large number of consecutive values fulfilling condition in a numpy array) 开始,我编写了以下解决方案,为二维数组找到 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 太大而无法放入内存时会发生什么?
【问题讨论】: