Resampling of MultiIndex



我想按类型对数据集进行每日细分。并不是每一种类型的每一天都有记录,它们不存在,我想要NaN。

我能够得到一个"重新采样到每日"的结果,但类型已提交。

下面的代码应该是一个完整的工作示例(好吧,除了最后的已知错误之外!):

import pandas as pd
import datetime as dt
df = pd.DataFrame({
'Date': [dt.datetime(2021,1,1), dt.datetime(2021, 1, 3), dt.datetime(2020,1,2)],
'Type': ['A', 'A', 'B'],
'Value': [1,2,3]
})
df.set_index('Date', inplace=True)
#   this loses the 'type'
print(df.resample('1D').mean())
df = df.reset_index().set_index(['Date', 'Type'])
#   this raises an exception "TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'MultiIndex'"
print(df.resample('1D').mean())

输出我正在寻找的是一行每天/键入组合:

3

如果需要每组抽样,可以使用Grouper每天抽样,然后使用Series.unstackDataFrame.stack添加缺失值:

df = (df.groupby(['Type', pd.Grouper(freq='1D', key='Date')])['Value']
.mean()
.unstack()
.stack(dropna=False)
.reset_index(name='Value')

)
print (df)  
Type       Date  Value
0    A 2021-01-01    1.0
1    A 2021-01-02    NaN
2    A 2021-01-03    2.0
3    B 2021-01-01    NaN
4    B 2021-01-02    3.0
5    B 2021-01-03    NaN

如果只需要添加每组缺少的日期时间,则使用DataFrame.reindex:

mux = pd.MultiIndex.from_product([df['Type'].unique(),
pd.date_range(df['Date'].min(), df['Date'].max())], 
names=['Date','Type'])
df = df.set_index(['Type','Date']).reindex(mux).reset_index()
print (df)                
Date       Type  Value
0    A 2021-01-01    1.0
1    A 2021-01-02    NaN
2    A 2021-01-03    2.0
3    B 2021-01-01    NaN
4    B 2021-01-02    3.0
5    B 2021-01-03    NaN

相关内容

  • 没有找到相关文章

最新更新