问题描述
我想按类型对数据集进行每日细分。每种类型都没有每天的记录,如果不存在,我想要 NaN。
我能够获得“重新采样到每日”的结果,但类型被忽略。
下面的代码应该是一个完整的示例(好吧,除了最后的已知错误!):
import pandas as pd
import datetime as dt
df = pd.DataFrame({
'Date': [dt.datetime(2021,1,1),dt.datetime(2021,3),dt.datetime(2020,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())
我正在寻找的输出是每天一行/类型组合:
日期 | 输入 | value |
---|---|---|
20210101 | A | 1 |
20210102 | A | NaN |
20210103 | A | 2 |
20210101 | B | NaN |
20210102 | B | 3 |
20210103 | B | NaN |
感谢收到任何建议或指示。
解决方法
如果需要每组重新采样,可以使用 Grouper
进行每天重新采样,然后使用 Series.unstack
和 DataFrame.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