python - 从 pandas 中的多索引日期获取频率表

标签 python pandas multi-index

这是测试数据

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 和 axis 的长度必须相同 错误。

这给出了我正在寻找的内容,但在我看来,使用时间索引应该更容易:

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()

countsize 之间的区别是 count 省略 NaNsize不是。

<小时/>
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

关于python - 从 pandas 中的多索引日期获取频率表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50592048/

相关文章:

Python oauth2 - 无属性 'HTTPSConnection'

python - 如何从我的 DataFrame 中删除 MultiIndex?

python - 使用 for 循环的多个水平堆叠条形图

python - 如果 DST 更改的数据帧频率低于 1 小时,则会出现 pytz 错误 [多索引 pandas]

python - 将数据存储到具有空字段的命名元组中以添加其他内容

python - 如何查看初始化权重(即训练前)?

python 字典列表如何合并键 :value where values are same?

python - 使用一组字符串对 pandas 系列进行索引会删除该系列中的原始数据

python - pandas 中添加列的一些计算

python - pandas 中的自定义 bin 和 sum ?