【发布时间】:2019-06-26 09:22:09
【问题描述】:
我有一个 pandas 数据框,我想识别所有负值并将它们替换为 NaN。此外,所有跟在负值后面的零也应替换为 NaN,直到出现第一个正值。
我认为使用 for 循环遍历数据框中的所有负值应该可以实现我的目标。
例如,对于索引标签为 1737 的负值,我可以使用如下内容:
# list indexes that follow the negative value
indexes = df['counter_diff'].loc[1737:,]
# find first value greater than zero
first_index = next(x for x, val in enumerate(indexes) if val > 0)
然后用 NaN 填充从索引 1737 到 first_index 的值。
但是,我的数据框非常大,所以我想知道是否有可能提出一种利用 pandas 的计算效率更高的方法。
这是一个输入示例:
# input column
In[]
pd.Series({0 : 1, 2 : 3, 3 : -1, 4 : 0, 5 : 0, 7 : 1, 9 : 3, 10 : 0, 11 : -2, 14 : 1})
Out[]
0 1
2 3
3 -1
4 0
5 0
7 1
9 3
10 0
11 -2
14 1
dtype: int64
以及所需的输出:
# desired output
In[]
pd.Series({0 : 1, 2 : 3, 3 : np.nan, 4 : np.nan, 5:np.nan, 7:1, 9:3, 10:0, 11 : np.nan, 14:1})
Out[]
0 1.0
2 3.0
3 NaN
4 NaN
5 NaN
7 1.0
9 3.0
10 0.0
11 NaN
14 1.0
dtype: float64
任何帮助将不胜感激!
【问题讨论】: