合并两个 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 数据帧,在一个时间列上重新采样,插值的主要内容,如果未能解决你的问题,请参考以下文章

在 2 列上合并 pandas 数据帧,但以任意顺序

Pandas 将多个数据帧与存储在多个列上的查找值合并

熊猫合并:合并同一列上的两个数据框,但保留不同的列

在 Pandas 中合并索引上的数据帧更有效

Pandas - 如何在不同格式的日期时间列上合并数据框?

Pandas:如何通过保留第一个数据框的信息来合并列上的两个数据框?