【问题标题】:Merge, Average, Custom Columns, etc. with Dataframes in Python使用 Python 中的 Dataframes 合并、平均、自定义列等
【发布时间】:2023-02-22 01:35:48
【问题描述】:

我对 Python 还是个新手,我正在尝试了解各种可能性以及我能够使用数据帧执行的操作的局限性。我将提供我拥有的 2 个数据帧的示例以及我希望实现的输出类型。

    df_1 = {
        'Rank': [64, 102, 34],
        'Team': ["AR Lit Rock", "Abl Christian", "Air Force",],
        '2022': [73.8, 71.5, 67.2,],
        'L3': [71.3, 77.3, 69.0,],
        'Home': [78.2, 73.6, 70.1,]
        'Away': [71.4, 70.2, 62.2,],
    }

    df_2 = {
        'Rank': [354, 284, 83],
        'Team': ["AR Lit Rock", "Abl Christian", "Air Force",],
        '2022': [80.7, 74.0, 67.0,],
        'L3': [78.7, 72.0, 75.3,],
        'Home': [75.3, 69.1, 65.0,]
        'Away': [83.7, 77.1, 70.3,],
    }

我正在寻找一个最终结果,它将 2 个数据帧合并为 1,同时平均“排名”,将“团队”合并为 1,这样它就不会重复,以及自定义列以使用新的列名称区分其余部分。

输出:

Rank Team 2022 PF 2022 PA L3 PF L3 PA Home PF Home PA Away PF Away PA
209 AR Lit Rock 73.8 80.7 71.3 78.7 78.2 75.3 71.4 83.7
193 Abl Christian 71.5 74.0 77.3 72.0 73.6 69.1 70.2 77.1
58.5 Air Force 67.2 67.0 69.0 75.3 70.1 65.0 62.2 70.3

我尝试了一些 concat 并使用基于特定列的平均值来获得“排名”的平均值,但是当我输出时,这也最终删除了其他列。

    final_df = pd.concat((df_1, df_2)).groupby('Team', as_index=False, sort=False)['Rank'].mean()

当涉及到将 2 组合起来并将不同的列名输出为特定顺序时,我什至不确定这是否可能只是为了寻找一些见解。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    合并基于 Team 的两个数据框,并使用后缀参数为每个非 Team 列创建两列。然后使用两个排名列计算平均排名列。之后,只是一些整容工作。

    df_1 = pd.DataFrame({
            'Rank': [64, 102, 34],
            'Team': ["AR Lit Rock", "Abl Christian", "Air Force",],
            '2022': [73.8, 71.5, 67.2,],
            'L3': [71.3, 77.3, 69.0,],
            'Home': [78.2, 73.6, 70.1,],
            'Away': [71.4, 70.2, 62.2,],
        })
    
    df_2 = pd.DataFrame({
            'Rank': [354, 284, 83],
            'Team': ["AR Lit Rock", "Abl Christian", "Air Force",],
            '2022': [80.7, 74.0, 67.0,],
            'L3': [78.7, 72.0, 75.3,],
            'Home': [75.3, 69.1, 65.0,],
            'Away': [83.7, 77.1, 70.3,],
        })
    
    # Merge dataframes with two columns per team
    merged_df = df_1.merge(df_2, on = 'Team', suffixes = (' PF', ' PA'))
    
    # Calculate averaged Rank
    merged_df['Rank'] = merged_df[['Rank PF', 'Rank PA']].mean(axis = 1)
    
    # Cosmetic stuff to match answer output
    merged_df.drop(columns = ['Rank PF', 'Rank PA'], inplace = True)
    merged_df.set_index('Rank', drop = True, inplace = True)
    
    merged_df = merged_df[['Team', '2022 PF', '2022 PA', 'L3 PF', 
                           'L3 PA', 'Home PF', 'Home PA', 'Away PF', 'Away PA']]
    

    【讨论】:

    • 好答案!将排名设置为索引似乎是不必要的。
    • 谢谢,我同意。我这样做是为了匹配问题的输出并自动排序。装饰部分的前两行可以很容易地用第三行完成,然后是 sort_values() 按等级排序。
    猜你喜欢
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2018-06-25
    • 2022-08-10
    相关资源
    最近更新 更多