【发布时间】:2016-04-12 07:20:36
【问题描述】:
我使用以下 Python 代码生成混合类型(浮点数和字符串)Pandas DataFrame df3:
df1 = pd.DataFrame(np.random.randn(dates.shape[0],2),index=dates,columns=list('AB'))
df1['C'] = 'A'
df1['D'] = 'Pickles'
df2 = pd.DataFrame(np.random.randn(dates.shape[0], 2),index=dates,columns=list('AB'))
df2['C'] = 'B'
df2['D'] = 'Ham'
df3 = pd.concat([df1, df2], axis=0)
当我将 df3 重新采样到更高的频率时,我没有将帧重新采样到更高的速率,但如何被忽略,我只是得到了缺失值:
df4 = df3.groupby(['C']).resample('M', how={'A': 'mean', 'B': 'mean', 'D': 'ffill'})
df4.head()
结果:
B A D
C
A 2014-03-31 -0.4640906 -0.2435414 Pickles
2014-04-30 NaN NaN NaN
2014-05-31 NaN NaN NaN
2014-06-30 -0.5626360 0.6679614 Pickles
2014-07-31 NaN NaN NaN
当我将 df3 重新采样到较低频率时,我根本没有得到任何重新采样:
df5 = df3.groupby(['C']).resample('A', how={'A': np.mean, 'B': np.mean, 'D': 'ffill'})
df5.head()
结果:
B A D
C
A 2014-03-31 NaN NaN Pickles
2014-06-30 NaN NaN Pickles
2014-09-30 NaN NaN Pickles
2014-12-31 -0.7429617 -0.1065645 Pickles
2015-03-31 NaN NaN Pickles
我很确定这与混合类型有关,因为如果我只用数字列重做年度下采样,一切都会按预期工作:
df5b = df3[['A', 'B', 'C']].groupby(['C']).resample('A', how={'A': np.mean, 'B': np.mean})
df5b.head()
结果:
B A
C
A 2014-12-31 -0.7429617 -0.1065645
2015-12-31 -0.6245030 -0.3101057
B 2014-12-31 0.4213621 -0.0708263
2015-12-31 -0.0607028 0.0110456
但即使我切换到数字类型,重采样到更高频率仍然无法按预期工作:
df4b = df3[['A', 'B', 'C']].groupby(['C']).resample('M', how={'A': 'mean', 'B': 'mean'})
df4b.head()
结果:
B A
C
A 2014-03-31 -0.4640906 -0.2435414
2014-04-30 NaN NaN
2014-05-31 NaN NaN
2014-06-30 -0.5626360 0.6679614
2014-07-31 NaN NaN
这给我留下了两个问题:
- 对混合类型的数据帧重新采样的正确方法是什么?
- 从较低频率重新采样到较高频率时,进行重新采样以便插入新值的正确方法是什么?
即使您无法为这两个部分提供完整的答案,我们也感谢您提供部分解决方案或任何一个问题的答案。
【问题讨论】:
标签: python numpy pandas time-series