gpt4 book ai didi

python - Pandas 惯用的方式来自定义 fillna

转载 作者:太空狗 更新时间:2023-10-30 01:05:58 25 4
gpt4 key购买 nike

我有以下格式的时间序列数据,其中一个值表示自过去记录以来的累积量。我想要做的是“传播”包含 NaN 的过去期间的累积金额,以便此输入:

s = pd.Series([0, 0, np.nan, np.nan, 75, np.nan, np.nan, np.nan, np.nan, 50],
pd.date_range(start="Jan 1 2016", end="Jan 10 2016", freq='D'))

2016-01-01 0.0
2016-01-02 0.0
2016-01-03 NaN
2016-01-04 NaN
2016-01-05 75.0
2016-01-06 NaN
2016-01-07 NaN
2016-01-08 NaN
2016-01-09 NaN
2016-01-10 50.0

变成这样的输出:

2016-01-01     0.0
2016-01-02 0.0
2016-01-03 25.0
2016-01-04 25.0
2016-01-05 25.0
2016-01-06 10.0
2016-01-07 10.0
2016-01-08 10.0
2016-01-09 10.0
2016-01-10 10.0

是否有一种惯用的 Pandas 方法来执行此操作,而不仅仅是对数据进行 for 循环?我已经尝试了各种涉及 fillnadropnaisnull、执行 shift 以检查下一个值的方法等,但我看不出如何将各个部分组合在一起。

最佳答案

这可能会奏效,对于每个缺失值 block ,使用 cumsum(从系列末尾开始)创建一个组变量,然后对每个 block 执行分组平均操作:

s.groupby(s.notnull()[::-1].cumsum()[::-1]).transform(lambda g: g[-1]/g.size)

#2016-01-01 0.0
#2016-01-02 0.0
#2016-01-03 25.0
#2016-01-04 25.0
#2016-01-05 25.0
#2016-01-06 10.0
#2016-01-07 10.0
#2016-01-08 10.0
#2016-01-09 10.0
#2016-01-10 10.0
#Freq: D, dtype: float64

或另一种选择:

s.groupby(s.shift().notnull().cumsum()).transform(lambda g: g[-1]/g.size)

#2016-01-01 0.0
#2016-01-02 0.0
#2016-01-03 25.0
#2016-01-04 25.0
#2016-01-05 25.0
#2016-01-06 10.0
#2016-01-07 10.0
#2016-01-08 10.0
#2016-01-09 10.0
#2016-01-10 10.0
#Freq: D, dtype: float64

关于python - Pandas 惯用的方式来自定义 fillna,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41151435/

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