Pandas:groupby并按月获得中值?

时间:2016-02-12 11:53:13

标签: python pandas

我有一个如下所示的数据框:

     org        date     value
0    00C  2013-04-01  0.092535
1    00D  2013-04-01  0.114941
2    00F  2013-04-01  0.102794
3    00G  2013-04-01  0.099421
4    00H  2013-04-01  0.114983

现在我想弄清楚:

  • 一年中每个月每个组织的中位值
  • 每个组织的X,其中X是最低中位数月值与最高中值之间的百分比差异。

在熊猫中接近这个的最佳方法是什么?

我试图按月生成中位数,但是它失败了:

df['date'] = pd.to_datetime(df['date'])
ave = df.groupby(['row_id', 'date.month']).median()

KeyError: 'date.month'失败。

更新:感谢@EdChum,我现在正在做:

ave = df.groupby([df['row_id'], df['date'].dt.month]).median()

效果很好并且给了我:

99P    1     0.106975
       2     0.091344
       3     0.098958
       4     0.092400
       5     0.087996
       6     0.081632
       7     0.083592
       8     0.075258
       9     0.080393
       10    0.089634
       11    0.085679
       12    0.108039
99Q    1     0.110889
       2     0.094837
       3     0.100658
       4     0.091641
       5     0.088971
       6     0.083329
       7     0.086465
       8     0.078368
       9     0.082947
       10    0.090943
       11    0.086343
       12    0.109408

现在我想,对于索引中的每个项目,我需要找到最小和最大计算值,然后找出它们之间的差异。最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

对于您的第一个错误,您有语法错误,您可以传递列名列表或列本身,您传递了一个名称列表,date.month不存在,所以您想要:

ave = df.groupby([df['row_id'], df['date'].dt.month]).median()

之后,您可以针对特定索引级别计算minmax,以便:

((ave.max(level=0) - ave.min(level=0))/ave.max(level=0)) * 100

应该给你你想要的东西。

计算每个组织的最小值和最大值之间的差异,除以该级别的最大值,并通过乘以100来创建百分比