我有两个数据框,正在尝试将数据从一个数据框映射到另一个数据框。第一个数据帧的标题是玩家名称,标题是玩家/游戏ID。
数据框1:
Date + Game 2015-04-12 PIT@MIL 2015-04-12 SEA@OAK \
Alcides Escobar 0 0
Mike Moustakas 0 0
Lorenzo Cain 0 0
Eric Hosmer 0 0
数据框2:
Name Date + Game
0 Alcides Escobar 2015-04-12 KAN@LAA
1 Mike Moustakas 2015-04-12 KAN@LAA
2 Lorenzo Cain 2015-04-12 KAN@LAA
3 Eric Hosmer 2015-04-12 KAN@LAA
4 Kendrys Morales 2015-04-12 KAN@LAA
5 Alex Rios 2015-04-12 KAN@LAA
6 Salvador Perez 2015-04-12 KAN@LAA
第二个数据框包含有关玩家的信息,并在两列中包含玩家的姓名和日期/游戏ID。我正在尝试使用以下公式根据玩家的姓名和ID将数据从第一个数据帧映射到第二个数据帧:
batter_game_logs_df['R vs SP'] = batter_game_logs_df['Name'].map(play_by_play_run_scored_SP_df[batter_game_logs_df['Date + Game']], na_action='ignore').fillna(0)
因为我要从第一个数据框中选择数据的列取决于第二个数据框中的“日期+游戏”列,所以代码显示错误,指出“该数据框对象不可调用”。如果我手动用日期/游戏ID替换列引用,则可以使用。例如,
batter_game_logs_df['R vs SP'] = batter_game_logs_df['Name'].map(play_by_play_run_scored_SP_df['2015-04-12 KAN@LAA'], na_action='ignore').fillna(0)
有人知道我如何在第二个数据框中创建一个将第一个数据中的数据链接起来的列吗?
答案 0 :(得分:1)
如果我正确理解了您的意图,那么更合适的示例数据集将是:
df1
Date + Game 2015-04-12 PIT@MIL 2015-04-12 KAN@LAA
0 Alcides Escobar 1 5
1 Mike Moustakas 2 6
2 Lorenzo Cain 3 7
3 Eric Hosmer 4 8
df2
Name Date + Game
0 Alcides Escobar 2015-04-12 PIT@MIL
1 Mike Moustakas 2015-04-12 PIT@MIL
2 Lorenzo Cain 2015-04-12 KAN@LAA
3 Eric Hosmer 2015-04-12 KID@MIT
4 Eric Hosmer 2015-04-12 KAN@LAA
无论如何,关键是将“宽”数据帧(df1
)映射到“高”数据帧(df2
)。为了实现这一点,我将首先使用“宽”数据帧(df1
)创建一个“高”数据帧,然后将其合并到另一个“高”数据帧(df2
)。
代码:
# derive "df2-like" dataframe using df1
df1 = (df1.rename(columns={'Date + Game': 'Name'})
.set_index('Name')
.stack()
.reset_index()
.rename(columns={'level_1': 'Date + Game', 0: 'R vs SP'})
)
# merge 2 dataframes
df2 = df2.merge(df1, on=['Name', 'Date + Game'], how='left').fillna(0)
输出(df2
):
Name Date + Game R vs SP
0 Alcides Escobar 2015-04-12 PIT@MIL 1.0
1 Mike Moustakas 2015-04-12 PIT@MIL 2.0
2 Lorenzo Cain 2015-04-12 KAN@LAA 7.0
3 Eric Hosmer 2015-04-12 KID@MIT 0.0
4 Eric Hosmer 2015-04-12 KAN@LAA 8.0