首页 > 解决方案 > 两个现有的 Numpy 数组,有条件地填充 NaN

问题描述

对于大型数据集中的每个组件,我有两个形状相同的 numpy 数组:原始数据和工件数据,存储在 pandas 数据框中,如下所示:

sub run1 ... run4
0 [data, art] ... [data, art]
1 [data, art] ... [data, art]
2 [data, art] ... [data, art]
3 [data, art] ... [data, art]
4 [data, art] ... [data, art]

例如:主题 1 运行 1 有

data([[104.,  96.,  94., ...,  99.,  99.,  96.],
       [102.,  94.,  92., ..., 100.,  99.,  97.],
       [101.,  93.,  91., ...,  98.,  98.,  96.],
       ...,
       [ -8.,  -5., -12., ...,  -9.,   3.,  10.],
       [ -8.,  -5., -13., ..., -10.,   4.,  11.],
       [ -9.,  -5., -13., ..., -10.,   5.,  13.]])

artifact([[2., 2., 2., ..., 2., 2., 2.],
       [2., 2., 2., ..., 2., 2., 2.],
       [2., 2., 2., ..., 2., 2., 2.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]])

当工件数组中的值不为0时,我想将数据数组中的相应位置替换为NaN。这可以在原地或在新阵列中完成。每次运行的受试者之间的长度不一定相同。

标签: pythonpandasnumpy

解决方案


在 Pandas 中使用循环(就像 Clayton 的答案一样)会导致性能不佳并使代码更难阅读。只要有可能,让 Pandas 为您处理迭代,如下所示:

def replace_values(item):
    """Operate on a single DataFrame cell
    """
    data = item[0]
    artifact = item[1]
    data[artifact == 0] = np.nan
    return [data, artifact]

df.applymap(replace_values)

这是一个重要的实践和方法论点。从根本上讲,Pandas 的主要卖点之一是它包含许多处理复杂操作的函数,省去了编写迭代控制结构的麻烦,并且运行速度更快。

从方法论上讲,这些“捆绑”操作使您不必考虑细节。用简单的英语,我的解决方案说:“这是一个在单元格上运行的函数。将它应用于每个单元格。” 简洁明了,一目了然,只要你知道是做什么applymap的。您不必通读显式循环语法来弄清楚发生了什么。

是的,有一点学习曲线,但这是值得的。


推荐阅读