对于大型数据集中的每个组件,我有两个形状相同的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)