从名称在另一列中给出的Pandas Dataframe列映射数据

时间:2018-07-17 21:17:44

标签: python pandas mapping

我有两个数据框,正在尝试将数据从一个数据框映射到另一个数据框。第一个数据帧的标题是玩家名称,标题是玩家/游戏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)

有人知道我如何在第二个数据框中创建一个将第一个数据中的数据链接起来的列吗?

1 个答案:

答案 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