gpt4 book ai didi

python - 将 panda 的缺失数据填充限制为多索引 DataFrame 上的单个索引

转载 作者:太空狗 更新时间:2023-10-30 02:44:12 26 4
gpt4 key购买 nike

例如,假设我有一个 df,其中包含“年”、“季度”(连续一年)、一个变量 (“var”) 和一个测量值 (“value”) 的列:

year   quarter   var  value
2015 1 A 0.1
2015 2 A 0.5
2015 3 A 0.6
2015 4 A 1.0
2015 1 B 0.1
2015 4 B 0.5
2015 2 C 0.0
2015 3 C 0.7
2015 4 C 1.2

但有时会丢失数据(例如:参见 [2015,2,'B'])。使用重新索引将 NaN 插入到数据中并不过分,所以我得到了这个:

year   quarter   var  value
2015 1 A 0.1
2015 2 A 0.5
2015 3 A 0.6
2015 4 A 1.0
2015 1 B 0.1
2015 2 B NaN
2015 3 B NaN
2015 4 B 0.5
2015 1 C NaN
2015 2 C 0.0
2015 3 C 0.7
2015 4 C 1.2

但我想做的是使用前向填充来填充“缺失”数据以传播值 - 即 df.ffill() - 然后用零填充剩余值 - 即 df.fillna(0 ) 这样你就可以得到这样的结果:

year   quarter   var  value
2015 1 A 0.1
2015 2 A 0.5
2015 3 A 0.6
2015 4 A 1.0
2015 1 B 0.1
2015 2 B 0.1
2015 3 B 0.1
2015 4 B 0.5
2015 1 C 0.0
2015 2 C 0.0
2015 3 C 0.7
2015 4 C 1.2

但是,当我使用 df.ffill() 时,我还没有找到通过“var”或“year”来限制/分区的方法。

我的第一个想法是将数据转换为数据透视表:

pd.pivot_table(data,values='value',index=['year','quarter'],columns='var',aggfunc=np.sum)

然后进行前向填充,但我不知道如何限制到年份(或如何将数据透视表解压缩回其原始形式)。

感谢任何帮助!

最佳答案

您基本上需要将数据放在一个表中,其中包含行索引的时间以及列中的所有其他内容。您可以使用数据透视表或堆栈/取消堆栈:

df2 = df.set_index(['year', 'quarter', 'var']).unstack('var')
>>> df2
value
var A B C
year quarter
2015 1 0.1 0.1 NaN
2 0.5 NaN 0.0
3 0.6 NaN 0.7
4 1.0 0.5 1.2

一旦数据在这个表单中,然后正向填充和反向填充。

df2 = df2.ffill().bfill(0)

最后,对数据进行堆叠和排序,然后根据需要重置索引:

   >>> df2.stack('var').sortlevel(2).reset_index()
year quarter var value
0 2015 1 A 0.1
1 2015 2 A 0.5
2 2015 3 A 0.6
3 2015 4 A 1.0
4 2015 1 B 0.1
5 2015 2 B 0.1
6 2015 3 B 0.1
7 2015 4 B 0.5
8 2015 1 C 0.0
9 2015 2 C 0.0
10 2015 3 C 0.7
11 2015 4 C 1.2

关于python - 将 panda 的缺失数据填充限制为多索引 DataFrame 上的单个索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30539352/

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