如何在多个键上合并并添加条件下的重制信息



我有一个简单的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

当您要将df2names列附加到具有匹配Iddf1时,我们可以在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

相关内容

  • 没有找到相关文章

最新更新