两个现有的 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 替换数据数组中的相应位置。这可以就地完成,也可以在新阵列中完成。受试者之间的每次运行不一定相同。

在 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做什么。您不必通读显式循环语法即可弄清楚发生了什么。

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

感谢您的建议。我想我找到了像这样实现 numpy 掩码的解决方法。

import numpy.ma as ma
def artifactEEG(df):
for sub in df.index.values:
for run in df.columns:
mx = ma.masked_array(df.loc[sub][run][0], mask=df.loc[sub][run][1])
df.loc[sub][run][0] = mx
return(df)

最新更新