gpt4 book ai didi

python - 用 NaN 替换 pandas 系列中的负值和 'blocks"连续零直到第一个正值

转载 作者:行者123 更新时间:2023-12-01 00:48:19 25 4
gpt4 key购买 nike

我有一个 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

如有任何帮助,我们将不胜感激!

最佳答案

你可以mask所有 0 并向前填充 ffill ,并检查该系列中的哪些值小于 0。然后使用生成的 bool 系列来掩盖原始系列:

s = pd.Series({0 : 1, 2 : 3, 3 : -1, 4 : 0, 5 : 0, 7 : 1, 9 : 3, 10 : 0, 11 : -2, 14 : 1})

s.mask(s.mask(s.eq(0)).ffill().lt(0))

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

关于python - 用 NaN 替换 pandas 系列中的负值和 'blocks"连续零直到第一个正值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56769369/

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