【问题标题】:Mapping data from a Pandas Dataframe column whose name is given in another column从名称在另一列中给出的 Pandas Dataframe 列映射数据
【发布时间】:2018-12-25 16:24:15
【问题描述】:

我有两个数据框,我正在尝试将数据从一个数据框映射到下一个数据框。第一个数据帧将玩家姓名作为其索引,将玩家/游戏 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)

有谁知道我如何设法在第二个数据框中创建一个列来链接第一个数据框中的数据?

【问题讨论】:

    标签: python pandas mapping


    【解决方案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
    

    【讨论】:

    • 这行得通!谢谢!我正在使用的数据采用非正统格式,因为我试图从文本数据中提取信息并对结果求和。这是我昨天提出的一个问题 (stackoverflow.com/questions/51362588/…) 的后续,这就是我最终得到这种奇怪格式的原因。无论如何,这是解决这个令人沮丧的过程中的最后一步,所以我非常感谢你!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2019-09-26
    • 2017-08-11
    • 1970-01-01
    • 2021-08-04
    • 2018-02-20
    • 2018-09-29
    相关资源
    最近更新 更多