gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:53:31 25 4
gpt4 key购买 nike

我一直在尝试根据以下规则从两个初始 bool 数组(df1 和 df2)创建一个新的 bool 数组:

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

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

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

将 pandas 导入为 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 以外的其他值?

优化在这个问题上非常重要,因为我会花很多时间来完成这个过程。

最佳答案

这应该会快一点(对于 200,000 行大约是 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 数组而不是数据帧/系列,您可能还会获得一点额外的速度,但我认为这不会太重要。

如果速度真的很重要,你应该尝试在 numpy 而不是 pandas 中做所有事情(如果可能),但我不确定 pandas ffill 的 numpy 模拟是否合适。

关于python - 将 0 替换为 pandas 数据帧中数组中的最后一个值(类似于具有 NaN 值的 fillna 方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47642570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com