我有一个数据框,其中包含组(county
),时间(此处为索引)信息,然后是感兴趣的变量emplvl
。我想为每个组计算两个特定时间emplvl
的差异,比如['2012-10' - '2005-01'
]。
我在这里看到了几种解决类似问题的方法,但所有这些方法都有一些麻烦:
df['2010-10']
来访问具有特定日期的数据,但如果我有一个超过date, county
的MultiIndex,这种方法不起作用 - 如果我没有,我怎样才能有效地找到通信?series.index.get_level_values('date').year == 2010
,并且类似于白天。我想我能做到这一点,但那我究竟能做些什么呢?我是否需要为每个县分组,然后手动执行时差?看起来效率也不高。 注意:我没有每个县 - 日期组合的数据,因此解决方案必须是NaN
- 健壮。这是一些示例数据:
emplvl county
date
2005-01-01 11441.000000 1001
2005-01-01 53733.000000 1003
2005-04-01 57080.000000 1003
2005-04-01 11531.000000 1001
2005-07-01 57612.000000 1003
2005-07-01 11320.000000 1001
2005-10-01 56016.000000 1003
2005-10-01 11516.666667 1001
2012-01-01 58028.666667 1003
2012-01-01 10065.333333 1001
2012-04-01 62307.666667 1003
2012-04-01 10172.666667 1001
2012-07-01 10042.000000 1001
2012-07-01 61926.000000 1003
2012-10-01 59498.666667 1003
2012-10-01 10267.666667 1001
difference county
59498.666667 - 53733.000000 1003
10267.666667 - 11441.000000 1001
答案 0 :(得分:0)
如果我理解你的问题:
In [81]: df.reset_index(inplace=True)
In [82]: df
Out[82]:
date emplvl county
0 2005-01-01 11441.000000 1001
1 2005-01-01 53733.000000 1003
2 2005-04-01 57080.000000 1003
3 2005-04-01 11531.000000 1001
4 2005-07-01 57612.000000 1003
5 2005-07-01 11320.000000 1001
6 2005-10-01 56016.000000 1003
7 2005-10-01 11516.666667 1001
8 2012-01-01 58028.666667 1003
9 2012-01-01 10065.333333 1001
10 2012-04-01 62307.666667 1003
11 2012-04-01 10172.666667 1001
12 2012-07-01 10042.000000 1001
13 2012-07-01 61926.000000 1003
14 2012-10-01 59498.666667 1003
15 2012-10-01 10267.666667 1001
In [83]: grouped = df.groupby([df.date.dt.year, df.date.dt.month, df.county]).sum()
In [84]: grouped
Out[84]:
emplvl
date date county
2005 1 1001 11441.000000
1003 53733.000000
4 1001 11531.000000
1003 57080.000000
7 1001 11320.000000
1003 57612.000000
10 1001 11516.666667
1003 56016.000000
2012 1 1001 10065.333333
1003 58028.666667
4 1001 10172.666667
1003 62307.666667
7 1001 10042.000000
1003 61926.000000
10 1001 10267.666667
1003 59498.666667
In [85]: grouped.ix[(2012, 10)] - grouped.ix[(2005, 1)]
Out[85]:
emplvl
county
1001 -1173.333333
1003 5765.666667