通过平滑合并DataFrame

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过平滑合并DataFrame相关的知识,希望对你有一定的参考价值。

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

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

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

以上是关于通过平滑合并DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用pd.concat纵向合并多个dataframe实战:纵向合并(ignore_index参数)为纵向合并的多个dataframe设置标识符指定数据来源(通过字典方式设置数据来源键)

Dataframe Pandas 的加法平滑

Pyspark Dataframe 通过消除空值来合并行

几条jQuery代码片段助力Web开发效率提升

R语言merge函数连接多个dataframe数据集迭代内连接dataframe数据( iteratively merge data frames in R)默认merge函数通过公共列名合并数据

管理导航抽屉内片段中的线程(用于平滑动画)