通过平滑合并DataFrame

问题描述 投票:2回答:1

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

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");
  • 对于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()
python-3.x pandas merge
1个回答
1
投票

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

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

Code

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()

Result

                                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
© www.soinside.com 2019 - 2024. All rights reserved.