Pandas:具有多个索引的滚动总和(即面板数据)

Posted

技术标签:

【中文标题】Pandas:具有多个索引的滚动总和(即面板数据)【英文标题】:Pandas: Rolling sum with multiple indexes (i.e. panel data) 【发布时间】:2016-12-20 03:54:27 【问题描述】:

我有一个具有多个索引的数据框,并希望创建一些数据的滚动总和,但针对索引中的每个 id。

例如,假设我有两个索引(FirmYear),并且我有一些名为 zdata 的数据。工作示例如下:

import pandas as pd

# generating data
firms = ['firm1']*5+['firm2']*5
years = [2000+i for i in range(5)]*2
zdata = [1 for i in range(10)]

# Creating the dataframe
mydf  = pd.DataFrame('firms':firms,'year':years,'zdata':zdata)

# Setting the two indexes
mydf.set_index(['firms','year'],inplace=True)

print(mydf)
             zdata
firms year       
firm1 2000      1
      2001      1
      2002      1
      2003      1
      2004      1
firm2 2000      1
      2001      1
      2002      1
      2003      1
      2004      1

现在,我想为每家公司重新开始滚动总和。但是,如果我输入

new_rolling_df=mydf.rolling(window=2).sum()

print(new_rolling_df)
              zdata
  firms year       
  firm1 2000    NaN
        2001    2.0
        2002    2.0
        2003    2.0
        2004    2.0
  firm2 2000    2.0
        2001    2.0
        2002    2.0
        2003    2.0
        2004    2.0

它没有考虑多重索引,只是做一个正常的滚动和。任何人都知道我应该怎么做(特别是因为我的索引甚至超过 2 个(公司、工人、国家、年份)

谢谢,

阿德里安

【问题讨论】:

【参考方案1】:

选项 1

mydf.unstack(0).rolling(2).sum().stack().swaplevel(0, 1).sort_index()

选项 2

mydf.groupby(level=0, group_keys=False).rolling(2).sum()

【讨论】:

非常感谢!我将使用第二种解决方案,因为解开我拥有的大型数据帧需要太多内存。快速评论,你能解释一下“level=0”吗?数字 0 指的是什么?特别是因为我想用更多的索引来复制它。 零级是索引的第一级。如果按索引分组,即使只有一个级别,也必须指定级别。而且,这是告诉 groupby 我想按索引级别分组的唯一方法。 @piRSquared- 感谢您提供此信息,在使其正常工作时遇到了很多麻烦。对我来说(我认为)是 group_keys 修复了它。你能解释一下这是做什么的吗?没有这个,我有一列 NaN。再次感谢您!

以上是关于Pandas:具有多个索引的滚动总和(即面板数据)的主要内容,如果未能解决你的问题,请参考以下文章

加快pandas groupby中的滚动总和计算

在具有多个参数的 pandas 数据帧上应用滚动函数

具有快速滚动和字母部分索引的 Android ListView

从 Pandas DataFrame 中的滚动总和中获取原始值

Python pandas - 将具有多个日期索引的csv合并到单个日期索引

Python Pandas - 如何在具有不同级别数的索引上加入 DataFrames?