Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 两个现有Numpy数组,有条件地填充NAN_Python_Pandas_Numpy - Fatal编程技术网

Python 两个现有Numpy数组,有条件地填充NAN

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.,

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