我有一个如下所示的数据框:
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()
之后,您可以计算特定索引级别的min
和max
,因此:
((ave.max(level=0) - ave.min(level=0))/ave.max(level=0)) * 100
应该给你你想要的。
这会计算每个组织的最小值和最大值之间的差值,除以该级别的最大值,然后乘以 100 得出百分比
关于python - Pandas :groupby并按月获得中值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35361975/