将0替换为dataframes中数组中的最后一个值(类似于具有NaN值的fillna方法)

2024-03-29 15:27:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试从两个初始布尔数组(df1和df2)创建一个新的布尔数组,遵循以下规则:

-如果在df1中看到最后一个真值,则df3中的值为真 -如果在df2中看到最后一个真值,则df3中的值为假

我找到了一种方法,将两个数组相减,然后用NaN值替换0值,使用.fillna方法填充NaN值,最后用0替换-1值。你知道吗

代码如下所示(以随机数组为例):

作为pd导入 导入matplotlib.pyplot文件作为plt 将numpy作为np导入

df1 = pd.Series((1,1,1,0,0,0,0,0,0,0,
                 0,0,0,0,1,0,0,1,0,0,
                 0,0,0,0,0,1,1,1,0,0,
                 0,0,0,0,0,0,0,0,0,0,
                 0,0,0,1,1,1,0,0,0,0))


df2 = pd.Series((0,0,0,0,0,0,1,1,0,0,
                 0,0,0,0,0,0,0,0,0,0,
                 1,0,0,0,0,0,0,0,0,0,
                 0,0,0,1,0,0,1,0,0,0,
                 0,0,0,0,0,0,0,0,0,0))

df3 = df1-df2
df3 = df3.replace(0,np.nan).fillna(method='ffill')
df3 = df3.replace(-1,0)

它实现了这个技巧,并返回了我想要的数组,但是它似乎没有优化到像这样多次删除值,并且使用fillna方法来实现我想要的。你知道吗

有人知道一种更“恰当”的方法吗?如果有一种方法类似于fillna方法,但使用的是除NaN以外的其他值?你知道吗

优化在这个问题上非常重要,因为我会花很多时间来处理这个过程。你知道吗


Tags: 方法代码matplotlib规则np数组nanreplace
1条回答
网友
1楼 · 发布于 2024-03-29 15:27:56

这应该快一点(200000行大约是6倍,当然你自己检查一下)。在import numpy as np之后:

arr = np.select( [df1==1,df2==1], [1,0], default=np.nan )
ser = pd.Series( arr ).ffill()

如果您不熟悉np.select,它与np.where非常相似,但允许多个条件。你也可以做一个嵌套的np.where,但是这样更容易阅读。你知道吗

下面是arr,允许你做一个简单的ffill而不需要使用replace两次的是你有nan而不是零。你知道吗

array([  1.,   1.,   1.,  nan,  nan,  nan,   0.,   0.,  nan,  nan,  nan,
        nan,  nan,  nan,   1.,  nan,  nan,   1.,  nan,  nan,   0.,  nan,
        nan,  nan,  nan,   1.,   1.,   1.,  nan,  nan,  nan,  nan,  nan,
         0.,  nan,  nan,   0.,  nan,  nan,  nan,  nan,  nan,  nan,   1.,
         1.,   1.,  nan,  nan,  nan,  nan])

通过将df1和df2存储为numpy数组而不是dataframes/series,您还可以获得一点额外的速度,但我认为这并不重要。你知道吗

如果速度真的是一个问题,你应该试着用numpy而不是pandas来做任何事情(如果可能的话),但是我不确定pandas有没有一个好的numpy模拟。你知道吗

相关问题 更多 >