gpt4 book ai didi

python - 通过使用 pandas 在时间序列中将值分配给先前的 NaN 来回填值

转载 作者:行者123 更新时间:2023-11-28 19:46:52 27 4
gpt4 key购买 nike

我有一个时间序列,其中每个观察值代表自上次观察以来某物的总量,如果在该时间步长内没有观察值,则该值报告为 NaN。格式示例:

Timestep  Value
1 10
2 NaN
3 NaN
4 9
5 NaN
6 NaN
7 NaN
8 16
9 NaN
10 NaN

我想做的是将观察到的值分布到它之前的 NaN 中。例如,像 [5, NaN, NaN, 6] 这样的序列将变为 [5, 2, 2, 2],最终观察值 6 分布在最后 2 个 NaN 值上。应用于所需输出上方的数据框将是:

Timestep  Value
1 10
2 3
3 3
4 3
5 4
6 4
7 4
8 4
9 NaN
10 NaN

我已经尝试使用一些 pandas 回填和插值方法来执行此操作,但还没有找到任何完全符合我要求的方法。

最佳答案

转换

df.Value.bfill().div(
df.groupby(df.Value.notna()[::-1].cumsum()).Value.transform('size')
)

0 10.0
1 3.0
2 3.0
3 3.0
4 4.0
5 4.0
6 4.0
7 4.0
8 NaN
9 NaN
Name: Value, dtype: float64

np.bincountpd.factorize

a = df.Value.notna().values
f, u = pd.factorize(a[::-1].cumsum()[::-1])

df.Value.bfill().div(np.bincount(f)[f])

0 10.0
1 3.0
2 3.0
3 3.0
4 4.0
5 4.0
6 4.0
7 4.0
8 NaN
9 NaN
Name: Value, dtype: float64

替代的较短版本。这是有效的,因为 cumsum 自然地给我提供了 factorize 的功能。

a = df.Value.notna().values[::-1].cumsum()[::-1]
df.Value.bfill().div(np.bincount(a)[a])

详情

在上面的两个选项中,我们需要确定空值的位置,并在反转序列上使用 cumsum 来定义组。在 transform 选项中,我使用 groupbysize 来计算这些组的大小。

第二个选项使用 bin 计数和切片来获得相同的系列。

谢谢@ScottBoston 提醒我提到反向元素 [::-1]

关于python - 通过使用 pandas 在时间序列中将值分配给先前的 NaN 来回填值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50254331/

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