gpt4 book ai didi

python - 将负数、NaN 和 0 替换为下一个和上一个正数的平均值

转载 作者:行者123 更新时间:2023-12-02 18:27:17 25 4
gpt4 key购买 nike

我想用同一列的下一个和上一个正数的平均值替换负数、NaN 和 0。

原始数据框

    a   c
0 1 1
1 2 2
2 0 5
3 -3 NaN
4 -1 5
5 3 3

预期输出数据帧为

    a    c
0 1 1
1 2 2
2 2.5 5 #In Col a --> Mean of 2 and 3 is 2.5 hence 0 replaced by 2.5
3 2.75 5 #In Col a --> Mean of 2.5 and 3 is 2.75 hence negative no. replaced by 2.75
4 2.875 5 #In Col a --> Mean of 2.75 and 3 is 2.875 hence negative no. replaced by 2.875
5 3 3

我尝试了另一种策略来处理负号。 Nan 和 0 将其替换为前 3 个值的平均值

m = df['a'] < 1
new = (df.loc[~m, 'a'].astype(float)
.rolling(2, min_periods=1).mean()
.reindex(df.index, method='ffill'))

df['a'].mask(m, new)

结果

0    1.0
1 2.0
2 1.5
3 1.5
4 1.5
5 2.0
Name: a, dtype: float64

但是,我正在努力实现新策略(被问到)。

最佳答案

我编辑了我的答案以更好地解决您的问题。但请注意,5 和 5 的平均值是 5,而不是您在预期结果中写的 2.5。

这个新答案基于下面 hpchavaz 的答案。

# Replace 0 and negative values with NaN
df = df.mask(df<=0)

# Compute rank of consecutive NaN values
rank = df.isnull().astype('int')
rank = rank.cumsum() - rank.cumsum().where(rank==0).ffill().fillna(0)
print(rank)

a b
0 0.0 0.0
1 0.0 0.0
2 1.0 0.0
3 2.0 1.0
4 3.0 0.0
5 0.0 0.0

# Compute first and last non null value before NaN range
first = df.ffill()
last = df.bfill()

# Finally, compute final df
df = last - (last-first)/2**(rank)
print(df)

a b
0 1.000 1.0
1 2.000 2.0
2 2.500 5.0
3 2.750 5.0
4 2.875 5.0
5 3.000 3.0

上一个答案

您可以调用mask将空值和负值替换为NaN,然后​​插值

不太清楚为什么你希望第二列中的 NaN 被替换为 2.5 而不是 5...

>>> df.mask(df<=0).interpolate()
a b
0 1.00 1.0
1 2.00 2.0
2 2.25 5.0
3 2.50 5.0
4 2.75 5.0
5 3.00 3.0

关于python - 将负数、NaN 和 0 替换为下一个和上一个正数的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69971833/

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