我一直在尝试从两个初始布尔数组(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以外的其他值?你知道吗
优化在这个问题上非常重要,因为我会花很多时间来处理这个过程。你知道吗
这应该快一点(200000行大约是6倍,当然你自己检查一下)。在
import numpy as np
之后:如果您不熟悉
np.select
,它与np.where
非常相似,但允许多个条件。你也可以做一个嵌套的np.where
,但是这样更容易阅读。你知道吗下面是arr,允许你做一个简单的
ffill
而不需要使用replace
两次的是你有nan
而不是零。你知道吗通过将df1和df2存储为numpy数组而不是dataframes/series,您还可以获得一点额外的速度,但我认为这并不重要。你知道吗
如果速度真的是一个问题,你应该试着用numpy而不是pandas来做任何事情(如果可能的话),但是我不确定pandas有没有一个好的numpy模拟。你知道吗
相关问题 更多 >
编程相关推荐