我有一个类似 Python 列表的结构,包含超过 100 万个元素。每个元素采用三个可能值之一,即 -1
、0
或 1
。我想要实现的目标是将所有零替换为下一个非零值。
例如,如果我有
[1, 0, 0, -1, 0, 1, 0, 0, 0, -1]
手术后我会有
[1, -1, -1, -1, 1 、1、-1、-1、>-1,-1]。
我可以使用嵌套循环结构来实现此目标,但列表中的元素超过 100 万个,它需要很长时间才能运行。有谁知道可以实现此目标的更快算法吗?
最佳答案
您可以尝试先创建系列
,然后replace
0
到 NaN
和上次使用 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/