python - Pandas :groupby并按月获得中值?

标签 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 是最低月度中值与最高中值之间的百分比差异。

在 Pandas 中解决这个问题的最佳方法是什么?

我尝试按如下方式按月生成中位数,但失败了:

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

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

最佳答案

对于您的第一个错误,您有一个语法错误,您可以传递列名列表或列本身,您传递了一个名称列表并且 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 得出百分比

关于python - Pandas :groupby并按月获得中值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35361975/

相关文章:

python - 从局部变量创建 python 字典的最简洁方法

python - 如何根据列值从 DataFrame 中选择行?

python - Pandas 保留每组前 N 个值,并将其他值设置为 0

python - 我可以将数据框导出到 Excel 作为第一个工作表吗?

python - 如何正确分割代码串

python - 上传亚马逊s3 python,boto3后获取文件url

python - 如何从字符串中删除列表中的所有元素?

python - 统一洗牌 5 GB 的 numpy 数据

python - 如何将多个标志传递给 Pandas 中的字符串提取方法?

python - 如何按类标签或任何特定列对 Pandas 数据框进行排序/分组