【问题标题】:Merging DataFrames via Smoothing通过平滑合并 DataFrame
【发布时间】:2018-06-25 04:09:58
【问题描述】:

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

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 将包含三列:Time、A 和 B,其中 Time 和 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】:

    如果您使用时间作为索引,您可以使用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
    

    【讨论】:

    • 谢谢!因此,通过更改df_A 的定义以匹配df_B(即以时间戳作为索引),然后执行df_C = df_A.merge(df_resampled, how="outer", left_index=True, right_index=True),我得到了预期的结果。
    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    相关资源
    最近更新 更多