我想有效地将两个数据帧合并为一个,但是一个数据帧比另一个具有“更多数据”。例如:
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()
答案 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