我有以下时间序列, 用于测量两列中起点和终点之间的变化。我想使用向量化的方法来计算第l列, 而不是在Pandas中记录从头到尾的路径的迭代。请问有简单的方法来计算列吗? ffill()和其他填充技术似乎并没有解决起始位置和结束位置之间的空白。有没有一种方法可以ffill/bfill以帮助解决此问题?
注意:s和e对应于开始和结束位置。我想建立一个序列, 其中l仅在s和e位置之间, 但不包括开始位置(并且不包括没有开始和结束的位置)。
在下面的示例中, 我们要在0-2行中用第一行以外的行填充l。还希望确保在我们有另一个s之前, 我们不会在行中添加一个。
sel
01.0 NaN NaN
1NaN NaN 1.0
2NaN 1.0 1.0
3NaN NaN NaN
4NaN NaN NaN
5NaN NaN NaN
6NaN NaN NaN
71.0 NaN NaN
81.0 1.0 1.0
91.0 1.0 1.0
101.0 1.0 1.0
11NaN 1.0 1.0
12NaN NaN NaN
13NaN NaN NaN
谢谢, 非常感谢你的帮助!
#1解决这些难以向量化的问题的一个好方法是使用numba。通过使用numba, 代码可以编译到C级, 因此在大型数据帧上应该可以很好地执行。通过具体化签名中的numba类型, 我们可以提前进行编译并进一步提高性能:
from numba import njit, float32@njit('float32[:](float64[:, :])')
def ffill_conditional(a):
flag_col0 = 0
out = np.full(a.shape[0], fill_value=http://www.srcmini.com/np.nan, dtype=float32)
for i in range(a.shape[0]):
if a[i, 0]==1. and flag_col0==0:
flag_col0 = 1
from_col0 = i+1
elif a[i, 1]==1 and np.isnan(a[i+1, 1]) and flag_col0==1:
till_col1 = i+1
out[from_col0:till_col1] = 1.
flag_col0=0
return out
【Python Pandas ffill if语句问题()】检查共享示例:
a = df.values[:, :2]
df['l'] = ffill_conditional(a)print(df)sel
01.0NaNNaN
1NaNNaN1.0
2NaN1.01.0
3NaNNaNNaN
4NaNNaNNaN
5NaNNaNNaN
6NaNNaNNaN
71.0NaNNaN
81.01.01.0
91.01.01.0
101.01.01.0
11NaN1.01.0
12NaNNaNNaN
13NaNNaNNaN
推荐阅读
- 使用JMESPath根据另一个查询结果过滤列表
- Pip已自行卸载,但我不知道是什么原因造成的
- 通过Python转义HTML中的单引号()
- Python中的Altair(数据可视化)
- 2020年11个最佳iOS开发框架热门推荐
- 如何实现android的翻转动画(已添加GIF)
- 安装新版本后,Android应用已关闭
- 使用GCP API密钥限制对特定GCP App Engine服务的访问()
- Android下载管理器未从https下载文件