Pandas MultiIndex:子组

时间:2016-04-14 16:07:25

标签: python datetime pandas

我有一个数据框,其中包含组(county),时间(此处为索引)信息,然后是感兴趣的变量emplvl。我想为每个组计算两个特定时间emplvl的差异,比如['2012-10' - '2005-01']。

我在这里看到了几种解决类似问题的方法,但所有这些方法都有一些麻烦:

  • 我可以使用df['2010-10']来访问具有特定日期的数据,但如果我有一个超过date, county的MultiIndex,这种方法不起作用 - 如果我没有,我怎样才能有效地找到通信?
  • Some说要使用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

1 个答案:

答案 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