合并两个 Pandas 数据帧,在一个时间列上重新采样,插值
Posted
技术标签:
【中文标题】合并两个 Pandas 数据帧,在一个时间列上重新采样,插值【英文标题】:Combine two Pandas dataframes, resample on one time column, interpolate 【发布时间】:2014-10-22 21:06:41 【问题描述】:这是我关于 *** 的第一个问题。放过我吧!
我有两个数据集由不同的采集系统以不同的采样率同时采集。一个是非常规律的,另一个则不是。我想创建一个包含两个数据集的单个数据框,使用规则间隔的时间戳(以秒为单位)作为两者的参考。不规则采样的数据应该在规则间隔的时间戳上插值。
这里有一些玩具数据展示了我正在尝试做的事情:
import pandas as pd
import numpy as np
# evenly spaced times
t1 = np.array([0,0.5,1.0,1.5,2.0])
y1 = t1
# unevenly spaced times
t2 = np.array([0,0.34,1.01,1.4,1.6,1.7,2.01])
y2 = 3*t2
df1 = pd.DataFrame(data='y1':y1,'t':t1)
df2 = pd.DataFrame(data='y2':y2,'t':t2)
df1 和 df2 如下所示:
df1:
t y1
0 0.0 0.0
1 0.5 0.5
2 1.0 1.0
3 1.5 1.5
4 2.0 2.0
df2:
t y2
0 0.00 0.00
1 0.34 1.02
2 1.01 3.03
3 1.40 4.20
4 1.60 4.80
5 1.70 5.10
6 2.01 6.03
我正在尝试合并 df1 和 df2,在 df1.t 上插值 y2。期望的结果是:
df_combined:
t y1 y2
0 0.0 0.0 0.0
1 0.5 0.5 1.5
2 1.0 1.0 3.0
3 1.5 1.5 4.5
4 2.0 2.0 6.0
我一直在阅读 pandas.resample 的文档,以及搜索以前的 *** 问题,但无法找到针对我的特定问题的解决方案。有任何想法吗?看起来应该很容易。
更新: 我想出了一个可能的解决方案:先插入第二个系列,然后附加到第一个数据帧:
from scipy.interpolate import interp1d
f2 = interp1d(t2,y2,bounds_error=False)
df1['y2'] = f2(df1.t)
给出:
df1:
t y1 y2
0 0.0 0.0 0.0
1 0.5 0.5 1.5
2 1.0 1.0 3.0
3 1.5 1.5 4.5
4 2.0 2.0 6.0
这可行,但如果有更好的方法,我仍然愿意接受其他解决方案。
【问题讨论】:
您应该将您的编辑添加为答案,以便其他人可以找到它们 我在谷歌上搜索了一段时间。很好的回答你自己的帖子。谢谢!我认为这应该是 Pandas 中 DataFrames 的基本功能,但我想没有内部方法。 我刚刚从下面的@K3---rnc 看到了答案。似乎比我自己对自己的回答更干净,但看起来两者都可以正常工作。谢谢! 【参考方案1】:如果您从 Series 构造单个 DataFrame,使用时间值作为索引,如下所示:
>>> t1 = np.array([0, 0.5, 1.0, 1.5, 2.0])
>>> y1 = pd.Series(t1, index=t1)
>>> t2 = np.array([0, 0.34, 1.01, 1.4, 1.6, 1.7, 2.01])
>>> y2 = pd.Series(3*t2, index=t2)
>>> df = pd.DataFrame('y1': y1, 'y2': y2)
>>> df
y1 y2
0.00 0.0 0.00
0.34 NaN 1.02
0.50 0.5 NaN
1.00 1.0 NaN
1.01 NaN 3.03
1.40 NaN 4.20
1.50 1.5 NaN
1.60 NaN 4.80
1.70 NaN 5.10
2.00 2.0 NaN
2.01 NaN 6.03
你可以简单地interpolate它,只选择定义y1
的部分:
>>> df.interpolate('index').reindex(y1)
y1 y2
0.0 0.0 0.0
0.5 0.5 1.5
1.0 1.0 3.0
1.5 1.5 4.5
2.0 2.0 6.0
【讨论】:
如果t列有重复怎么办?【参考方案2】:我不太清楚你是如何去掉 y2 中的一些值的,但似乎如果给定时间点有多个值,你只需要第一个。此外,您的时间值似乎应该在索引中。我还添加了列标签。它看起来像这样:
import pandas as pd
# evenly spaced times
t1 = [0,0.5,1.0,1.5,2.0]
y1 = t1
# unevenly spaced times
t2 = [0,0.34,1.01,1.4,1.6,1.7,2.01]
# round t2 values to the nearest half
new_t2 = [round(num * 2)/2 for num in t2]
# set y2 values
y2 = [3*z for z in new_t2]
# eliminate entries that have the same index value
for x in range(1, len(new_t2), -1):
if new_t2[x] == new_t2[x-1]:
new_t2.delete(x)
y2.delete(x)
ser1 = pd.Series(y1, index=t1)
ser2 = pd.Series(y2, index=new_t2)
df = pd.concat((ser1, ser2), axis=1)
df.columns = ('Y1', 'Y2')
print df
打印出来:
Y1 Y2
0.0 0.0 0.0
0.5 0.5 1.5
1.0 1.0 3.0
1.5 1.5 4.5
1.5 1.5 4.5
1.5 1.5 4.5
2.0 2.0 6.0
【讨论】:
以上是关于合并两个 Pandas 数据帧,在一个时间列上重新采样,插值的主要内容,如果未能解决你的问题,请参考以下文章