我有一个简单的Dataframe,我正在执行合并,它有三个标签,Id、year和一个值,我有另一个Df,它有相同的Id和不同的年份,一个简单示例df1的一些名称如下:
Id Value Year
1 10 2010
6 11 2020
3 12 2019
4 15 2018
2 17 2017
df2看起来是这样的:
Id names Year
1 bs 2017
2 fs 2017
6 td 2020
4 dh 2018
3 sv 2019
所以我正在合并使用:
df3 = pd.merge(df1, df2, left_on=['Id', 'Year'],right_on=['Id', 'Year'],how='left')
我想得到的答案是,但我不知道如何做到:
Id Value Year names
1 10 2010 bs
6 11 2020 td
3 12 2019 sv
4 15 2018 dh
5 17 2017 fs
因此,我们的想法是,2017年以下的数据可以从2017年的数据中分配——我拥有的数据帧要长得多。
您可以制作临时列,在其中使用一些常量数年<2017,并在Id
和本栏合并:
df1["tmp"] = np.where(df1["Year"] <= 2017, 1, df1["Year"])
df2["tmp"] = np.where(df2["Year"] <= 2017, 1, df2["Year"])
df3 = pd.merge(
df1, df2, left_on=["Id", "tmp"], right_on=["Id", "tmp"], how="left"
)
print(
df3[["Id", "Value", "Year_x", "names"]].rename(columns={"Year_x": "Year"})
)
打印:
Id Value Year names
0 1 10 2010 bs
1 6 11 2020 td
2 3 12 2019 sv
3 4 15 2018 dh
4 2 17 2017 fs
当您要将df2
的names
列附加到具有匹配Id
的df1
时,我们可以在Id
上制作具有相同索引的2个数据帧,并在删除df2的Year
列后将其连接。
我们可以将.join()
与.set_index()
一起使用,如下所示:
(df1.set_index('Id')
.join(
df2.set_index('Id')
.drop(columns='Year')
)
).reset_index()
# Result
Id Value Year names
0 1 10 2010 bs
1 6 11 2020 td
2 3 12 2019 sv
3 4 15 2018 dh
4 2 17 2017 fs