python - 从熊猫中的多索引日期获取频率表
问题描述
这是测试数据
import numpy as np
import pandas as pd
import datetime
# multi-indexed dataframe via cartesian join
df1 = pd.DataFrame([1, 2, 3])
df2 = pd.DataFrame(pd.date_range(start='2016', end='2018', freq='M'))
df1['key'] = 0
df2['key'] = 0
df = df1.merge(df2, how='outer', on='key')
del df1, df2
del df['key']
df.columns = ['id','date']
df['value'] = pd.DataFrame(np.random.randn(len(df)))
df.set_index(['date', 'id'], inplace=True)
df.sort_index(inplace=True)
df.head()
输出:
value
date id
2016-01-31 1 0.245029
2 -2.141292
3 1.521566
2016-02-29 1 0.870639
2 1.407977
可能有更好的方法来生成笛卡尔连接,但我是新手,这是我能找到的最好的方法来生成看起来像我的面板数据。无论如何,我的目标是创建一个快速表来查看观察模式,以查看是否缺少与时间相关的任何内容。
我的目标是创建逐月的频率观察表。这接近我想要的:
df.groupby(pd.Grouper(level='date',freq='M')).count()
但它给出了一个垂直列表。我的数据比这个小 MWE 大得多,所以我想更紧凑地拟合它,并查看是否存在季节性模式(即 12 月或 6 月的大量观察结果)。
在我看来,这应该有效,但它没有:
df.groupby([df.index.levels[0].month, df.index.levels[0].year]).count()
我得到一个ValueError: Grouper and axis must be same length
错误。
这给出了我正在寻找的东西,但在我看来,时间索引应该更容易:
df.reset_index(inplace=True)
df['month'] = df['date'].dt.month
df['year'] = df['date'].dt.year
df.groupby(['month', 'year'])['value'].count().unstack().T
输出:
month 1 2 3 4 5 6 7 8 9 10 11 12
year
2016 3 3 3 3 3 3 3 3 3 3 3 3
2017 3 3 3 3 3 3 3 3 3 3 3 3
另外,由于这只是一个快速验证,我宁愿不重置索引,然后每次都重新建立索引(并删除月份和年份),只是为了查看这个表。
解决方案
我认为需要Index.get_level_values
选择第一级MultiIndex
:
idx = df.index.get_level_values(0)
df1 = df.groupby([idx.year, idx.month])['value'].count().unstack()
或者:
df1 = df.groupby([idx.year, idx.month]).size().unstack()
count
和之间的区别size
是count
省略NaN
s和size
not。
print (df1)
date 1 2 3 4 5 6 7 8 9 10 11 12
date
2016 3 3 3 3 3 3 3 3 3 3 3 3
2017 3 3 3 3 3 3 3 3 3 3 3 3
推荐阅读
- html - 如何使文本出现在悬停[我们悬停在任何按钮上时通常出现的黄色背景文本]
- php - 在 Windows 上将 Xdebug 和 PhpStorm 与 Docker 容器一起使用
- php - 在 Laravel 8 中重定向
- angular - 从 Angular 中的不同路径导航到同一路径
- android - 小米 K20 Pro 上的 INSTALL_FAILED_MISSING_SHARED_LIBRARY
- amazon-web-services - aws api gateway - 选择“使用 lambda 代理集成”时如何显示 lambda 状态代码
- hashmap - 将 HashMap 作为参数传递给子类构造函数
- r - 在 ggplot 中标记点顶部
- docker - 来自一个 git 存储库的 docker 中的多个环境
- python - 如何找到具有不同特征值的两个矩阵的共同特征向量