Python:如何将列表/数组/pd.Series中的零值设置为下一个非零值?

标签 python algorithm python-2.7 sorting pandas

我有一个类似 Python 列表的结构,包含超过 100 万个元素。每个元素采用三个可能值之一,即 -101。我想要实现的目标是将所有零替换为下一个非零值。

例如,如果我有

[1, 0, 0, -1, 0, 1, 0, 0, 0, -1]

手术后我会有

[1, -1, -1, -1, 1 、1、-1-1>-1,-1]。

我可以使用嵌套循环结构来实现此目标,但列表中的元素超过 100 万个,它需要很长时间才能运行。有谁知道可以实现此目标的更快算法吗?

最佳答案

您可以尝试先创建系列,然后replace 0NaN 和上次使用 fillna :

import pandas as pd
import numpy as np

li = [1, 0, 0, -1, 0, 1, 0, 0, 0, -1]
s = pd.Series(li)
print s
0    1
1    0
2    0
3   -1
4    0
5    1
6    0
7    0
8    0
9   -1
dtype: int64


print s.replace({0:np.nan})
0     1
1   NaN
2   NaN
3    -1
4   NaN
5     1
6   NaN
7   NaN
8   NaN
9    -1
dtype: float64
print s.replace({0:np.nan}).fillna(method='bfill')
0    1
1   -1
2   -1
3   -1
4    1
5    1
6   -1
7   -1
8   -1
9   -1
dtype: float64

或者替换使用 loc ,然后通过 astype 转换为 int最后一次使用 tolist :

s.loc[s == 0] = np.nan

s.loc[s == 0] = np.nan
print s.fillna(method='bfill').astype(int).tolist()
[1, -1, -1, -1, 1, 1, -1, -1, -1, -1]

关于Python:如何将列表/数组/pd.Series中的零值设置为下一个非零值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35705920/

相关文章:

python - 为什么我收到此错误(AttributeError : 'module' object has no attribute 'openssl_md_meth_names' )?

python - 导入错误 : cannot import name 'TimedJSONWebSignatureSerializer' from 'itsdangerous'

java - 将返回案例添加到递归函数

python - 它说我定义的变量是 "referenced before assignment"

c++ - 用于查找范围重叠的内存效率更高的算法

algorithm - 给定算法的最坏情况运行时间是多少

python - Luigi 任务在依赖完成时在运行时返回未完成的依赖

python - 如何压缩整个目录的内容?

python - 如何存储一个大的、稀疏的、多维的表,其中的单元格包含不同数量的元素?

python - 如何将额外的结果从 python 生成器发送到消费者函数?