使用多合并删除列-Python

时间:2018-12-14 16:00:08

标签: python merge

我正在使用数据库的相同列中的过去数据创建列。就像当天一样,我需要前一天的Y值以及前一周的一周的同一天。所以:

x = df.copy()
x["Date"] = pd.to_datetime(df.rename(columns={"Año":"Year","Mes":"Month","Dia":"Day"})[["Year","Month","Day"]])

y = x[["Date","Y"]]
y.rename(columns={"Y":"Y_DiaAnterior"}, inplace=True)
y["Date"] = y["Date"] + dt.timedelta(days=1)
z = pd.merge(x,y,on=["Date"], how="left")
display(y.head()) # First merge result

a = x[["Date","Y"]]
a.rename(columns={"Y":"Y_DiaSemAnterior"}, inplace=True)
a["Date"] = a["Date"] + dt.timedelta(days=7)
z = pd.merge(x,a,on=["Date"], how="left")

z.head() # Second merge result

其中y df是辅助df,用于创建包含前一天数据的列Y,而a df是辅助df,用于创建列{ {1}},以及上周的当天数据。

当我分别合并它们时,它工作得很好,但是当我想合并所有它们(首先将x与y,然后将x与a合并)时,将x与y合并将被“删除”,如您所见即使已经合并了{1}}列也不在最后的Y(或“第二合并结果”)中。

第一个合并结果 Foto1

第二合并结果 Foto2

那么,如何使最后的Y_DiaAnterior具有dfdf变量呢?

1 个答案:

答案 0 :(得分:1)

因为您要用zx的新合并覆盖a。另外,因为使用的是y.head(),所以您没有在代码中显示第一次合并的结果。

如果要获得所有3个df的合并结果,则可以链接合并:

# prep x
x = df.copy()
x["Date"] = pd.to_datetime(df.rename(columns={"Año":"Year", "Mes":"Month", "Dia":"Day"})[["Year", "Month", "Day"]])

# prep y
y = x[["Date", "Y"]].copy()
y.rename(columns={"Y":"Y_DiaAnterior"}, inplace=True)
y["Date"] = y["Date"] + dt.timedelta(days=1)

# prep a
a = x[["Date", "Y"]].copy()
a.rename(columns={"Y":"Y_DiaSemAnterior"}, inplace=True)
a["Date"] = a["Date"] + dt.timedelta(days=7)

# now merge all
z = x.merge(y, on='Date', how='left') \
    .merge(a, on='Date', how='left')