【发布时间】: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