从与列值和列名称匹配的不同数据帧填充新的 pandas 列值

问题描述 投票:0回答:2

对奇怪的措辞表示歉意,不确定如何表达这个问题,但希望这个例子能表达出来。我有两个数据框,想要通过根据两个 df1 列中的值进行匹配,用 df2 中的值填充 df1 中的新列。问题是,在 df2 中,这些值之一不在列中,而是在列名称中。

df1

NAME YEAR

Anna 2002
Mary 2001
Paul 2000
Paul 2001
Mary 2002
Anna 2001
Anna 2000
Mary 2000
Paul 2002


df2

NAME 2000 2001 2002

Anna 5    4    3
Mary 3    2    5
Paul 2    3    4


expected result:

df1

NAME YEAR SCORE

Anna 2002 3
Mary 2001 2
Paul 2000 2
Paul 2001 3
Mary 2002 5
Anna 2001 4
Anna 2000 5
Mary 2000 3
Paul 2002 4


我可以合并 NAME 上的两个数据框,但这并不能解决我的问题,因为我只需添加三列。我想知道这是否需要一些 for 循环遍历列,但我是初学者,不确定我是否没有使事情变得过于复杂(并创建一个非常长的过程)。即使只是提示在文档中查找的位置也会非常有帮助!

python pandas dataframe merge
2个回答
0
投票

尝试:

pd.melt(df2, id_vars=['NAME'], value_vars=['2000', '2001', '2002'])

这将给出:

   NAME variable  value
0  Anna     2000      5
1  Mary     2000      3
2  Paul     2000      2
3  Anna     2001      4
4  Mary     2001      2
5  Paul     2001      3
6  Anna     2002      3
7  Mary     2002      5
8  Paul     2002      4

现在您可以合并了

您还可以重命名列名称:

df2.rename(columns={'variable':'YEAR', 'value':'SCORE'})

0
投票

或者,使用

.set_index()
/
.stack()
:

print(
    df2.set_index("NAME")
    .stack()
    .reset_index()
    .rename(columns={0: "SCORE", "level_1": "YEAR"})
)

打印:

   NAME  YEAR  SCORE
0  Anna  2000      5
1  Anna  2001      4
2  Anna  2002      3
3  Mary  2000      3
4  Mary  2001      2
5  Mary  2002      5
6  Paul  2000      2
7  Paul  2001      3
8  Paul  2002      4
© www.soinside.com 2019 - 2024. All rights reserved.