重采样后合并熊猫数据帧
Posted
技术标签:
【中文标题】重采样后合并熊猫数据帧【英文标题】:merging pandas DataFrames after resampling 【发布时间】:2018-11-16 22:39:51 【问题描述】:我有一个带有日期时间索引的 DataFrame。
df1=pd.DataFrame(index=pd.date_range('20100201', periods=24, freq='8h3min'),
data=np.random.rand(24),columns=['Rubbish'])
df1.index=df1.index.to_datetime()
我想重新采样这个 DataFrame,如下所示:
df1=df1.resample('7D').agg(np.median)
然后我有另一个 DataFrame,具有不同频率的索引并从不同的偏移小时开始
df2=pd.DataFrame(index=pd.date_range('20100205', periods=24, freq='6h3min'),
data=np.random.rand(24),columns=['Rubbish'])
df2.index=df2.index.to_datetime()
df2=df2.resample('7D').agg(np.median)
这些操作独立运行良好,但是当我尝试使用
合并结果时print(pd.merge(df1,df2,right_index=True,left_index=True,how='outer'))
我明白了:
Rubbish_x Rubbish_y
2010-02-01 0.585986 NaN
2010-02-05 NaN 0.423316
2010-02-08 0.767499 NaN
虽然我想用相同的偏移量重新采样,并在合并后得到以下结果
Rubbish_x Rubbish_y
2010-02-01 AVALUE AVALUE
2010-02-08 AVALUE AVALUE
我尝试了以下方法,但它只生成 nans
df2.reindex(df1.index)
print(pd.merge(df1,df2,right_index=True,left_index=True,how='outer'))
我必须坚持pandas 0.20.1
。
我试过mergeas_of
df1.index
Out[48]: Index([2015-03-24, 2015-03-31, 2015-04-07, 2015-04-14, 2015-04-21, 2015-04-28], dtype='object')
df2.index
Out[49]: Index([2015-03-24, 2015-03-31, 2015-04-07, 2015-04-14, 2015-04-21, 2015-04-28], dtype='object')
output=pd.merge_asof(df1,df2,left_index=True,right_index=True)
但它会因以下回溯而崩溃
Traceback (most recent call last):
TypeError: 'NoneType' object is not callable
【问题讨论】:
【参考方案1】:我相信需要merge_asof
:
print(pd.merge_asof(df1,df2,right_index=True,left_index=True))
Rubbish_x Rubbish_y
2010-02-01 0.446505 NaN
2010-02-08 0.474330 0.606826
或参数method='nearest'
转reindex
:
df2 = df2.reindex(df1.index, method='nearest')
print (df2)
Rubbish
2010-02-01 0.415248
2010-02-08 0.415248
print(pd.merge(df1,df2,right_index=True,left_index=True,how='outer'))
Rubbish_x Rubbish_y
2010-02-01 0.431966 0.415248
2010-02-08 0.279121 0.415248
【讨论】:
我已经编辑了答案,mergeasof 有问题 @00__00__00 - 嗯,如果有相同的索引值,那么merge
就足够了,不需要merge_asof
@00__00__00 - 超级:)
其实还是有问题。只要 df2 的第一个索引在 df1 的第一个索引之后,它就可以正常工作。如果不是这种情况,我仍然会得到不一致的索引,就像问题中一样
00__00__00 hmmm,似乎两个索引通常不匹配。那么什么是规则,可以指定它们吗?我有一个想法 - 将 method='nearest'
更改为 method='ffill'
或 method='bfill'。【参考方案2】:
我认为遵循代码库可以完成您的任务。
>>> index = pd.date_range('1/1/2000', periods=9, freq='T')
>>> series = pd.Series(range(9), index=index)
>>> series
2000-01-01 00:00:00 0
2000-01-01 00:01:00 1
2000-01-01 00:02:00 2
2000-01-01 00:03:00 3
2000-01-01 00:04:00 4
2000-01-01 00:05:00 5
2000-01-01 00:06:00 6
2000-01-01 00:07:00 7
2000-01-01 00:08:00 8
Freq: T, dtype: int64
>>> series.resample('3T').sum()
2000-01-01 00:00:00 3
2000-01-01 00:03:00 12
2000-01-01 00:06:00 21
Freq: 3T, dtype: int64
https://pandas.pydata.org/pandas-docs/version/0.22/generated/pandas.DataFrame.resample.html
【讨论】:
很抱歉,我看不出这是如何回答问题的以上是关于重采样后合并熊猫数据帧的主要内容,如果未能解决你的问题,请参考以下文章