Pandas:具有多个索引的滚动总和(即面板数据)
Posted
技术标签:
【中文标题】Pandas:具有多个索引的滚动总和(即面板数据)【英文标题】:Pandas: Rolling sum with multiple indexes (i.e. panel data) 【发布时间】:2016-12-20 03:54:27 【问题描述】:我有一个具有多个索引的数据框,并希望创建一些数据的滚动总和,但针对索引中的每个 id。
例如,假设我有两个索引(Firm 和 Year),并且我有一些名为 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:具有多个索引的滚动总和(即面板数据)的主要内容,如果未能解决你的问题,请参考以下文章
具有快速滚动和字母部分索引的 Android ListView
从 Pandas DataFrame 中的滚动总和中获取原始值