通过平滑合并DataFrame

时间:2018-01-16 12:36:21

标签: python-3.x pandas merge

我想有效地将​​两个数据帧合并为一个,但是一个数据帧比另一个具有“更多数据”。例如:

df_A = pd.DataFrame({"Time": [pd.to_datetime("09:11:37.600"),
                              pd.to_datetime("09:11:37.700"),
                              pd.to_datetime("09:11:37.800")],
                    "A": [0.1, 0.7, -1.1]})
df_B = pd.DataFrame({"Time": [pd.to_datetime("09:11:37.610"),
                              pd.to_datetime("09:11:37.640"),
                              pd.to_datetime("09:11:37.670"),
                              pd.to_datetime("09:11:37.700"),
                              pd.to_datetime("09:11:37.730"),
                              pd.to_datetime("09:11:37.760"),
                              pd.to_datetime("09:11:37.790"),
                              pd.to_datetime("09:11:37.820")],
                    "B": [0.3, -1.5, -0.5, 0.2, 1.2, -0.9, 0.1, -0.2]})

我想创建第三个数据框df_C,它是最短的先前数据帧的增强副本。增强由最长数据帧中的“平滑”列给出。可以通过平均操作或另一个来执行平滑。在此示例中,我想执行以下操作:

  • 对于与pd.to_datetime("09:11:37.600")对应的行,将值0.3, -1.5, -0.5取平均值,因为它们对应于pd.to_datetime("09:11:37.600")与下一行中的时间pd.to_datetime("09:11:37.700")之间的时间; < / LI>
  • 对于pd.to_datetime("09:11:37.700")对应的值,将值0.2, 1.2, -0.9, 0.1取平均值,因为它们对应于pd.to_datetime("09:11:37.700")与下一行中pd.to_datetime("09:11:37.800")的时间之间的时间;
  • 等等。

数据框df_C将有三列:时间,A和B,其中时间和A来自df_A,B是来自df_B的“平滑”列按照上述程序。

有没有办法在没有明确编写for循环的情况下执行此操作,这对于很长的数据帧来说可能很昂贵?

我尝试了以下操作,但它将相同的值复制到所有日期(即,它不正确)。

df_C = df_A.copy()
df_C.loc[:, "B"] = df_B.loc[(df_B["Time"] >= df_A.shift(1)["Time"].values[1]) & (df_B["Time"] < df_A.shift(-1)["Time"].values[0]), "B"].mean()

1 个答案:

答案 0 :(得分:1)

如果您将时间用作索引,则可以使用pandas.resample()方法。

Here您可以找到用于不同时期的缩写。

代码

import pandas as pd

df_B = pd.DataFrame(
    {"B": [0.3, -1.5, -0.5, 0.2, 1.2, -0.9, 0.1, -0.2]},
    index = [
        pd.to_datetime("09:11:37.610"),
        pd.to_datetime("09:11:37.640"),
        pd.to_datetime("09:11:37.670"),
        pd.to_datetime("09:11:37.700"),
        pd.to_datetime("09:11:37.730"),
        pd.to_datetime("09:11:37.760"),
        pd.to_datetime("09:11:37.790"),
        pd.to_datetime("09:11:37.820")])

df_resampled = df_B.resample('100L').mean()

结果

                                B
2018-03-05 09:11:37.600 -0.566667
2018-03-05 09:11:37.700  0.150000
2018-03-05 09:11:37.800 -0.200000