Python 两个现有Numpy数组,有条件地填充NAN
对于大型数据集中的每个组件,我有两个形状相同的numpy数组:原始数据和工件数据,存储在熊猫数据框中,如下所示:Python 两个现有Numpy数组,有条件地填充NAN,python,pandas,numpy,Python,Pandas,Numpy,对于大型数据集中的每个组件,我有两个形状相同的numpy数组:原始数据和工件数据,存储在熊猫数据框中,如下所示: 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.,
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.]])
及
当工件数组中的值不是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)
在numpy中,它非常简单:
data[artifact==0]=np.nan
。使用以下命令,我得到一个错误,即对象不可下标对于sub-in-subs:对于磨合运行:df.loc[sub][run][data][df.loc[sub][run][art]==0]=np.nan``提供的答案被标记为低质量帖子供审查。以下是一些指导原则。提供的答案可能是正确的,但可以从解释中获益。仅代码答案不被视为“好”答案。发帖前我确实阅读了指南,因为我想知道同样的事情,但指南中没有任何地方说你应该提供解释。查看一些参考资料。我们不会投票删除只使用代码的答案,而是添加一条注释,要求提供更多解释。更多总是更好。顺便说一句,这是一个很好的答案,也是关于循环的观点。你不能在评论中投票,但我现在投票了。你能提供更多关于实施的信息吗?在此上下文中,我不关注关于单个数据帧单元操作的注释。您是否仍然需要在数据帧上循环,然后应用此函数?
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)