【问题标题】:How to add rows as sums of other rows in DataFrame?如何将行添加为DataFrame中其他行的总和?
【发布时间】:2021-10-16 18:01:24
【问题描述】:

我不确定我对这篇文章的标题是否正确,但我有一个独特的情况,我想将一组新的行作为现有集合中的行的总和附加到现有 DataFrame 中,但我不确定从哪里开始.

例如,我有以下DataFrame:

import pandas as pd

data = {'Team': ['Atlanta', 'Atlanta', 'Cleveland', 'Cleveland'],
        'Position': ['Defense', 'Kicker', 'Defense', 'Kicker'],
        'Points': [5, 10, 15, 20]}

df = pd.DataFrame(data)

print(df)

        Team Position  Points
0    Atlanta  Defense       5
1    Atlanta   Kicker      10
2  Cleveland  Defense      15
3  Cleveland   Kicker      20

如何创建/追加新行,为每个团队创建一个新位置并将每个团队的两个现有位置的积分相加?此外,完整的数据集还包含多个团队,因此我正在寻找一种适用于任意数量团队的解决方案。

编辑: 我忘了包括完整的 DataFrame 中还有其他位置;但是,我只希望这个解决方案适用于“防守”和“踢球者”的位置。

我想要的输出如下。

            Team Position  Points
        Team          Position  Points
0    Atlanta           Defense       5
1    Atlanta            Kicker      10
2  Cleveland           Defense      15
3  Cleveland            Kicker      20
4    Atlanta  Defense + Kicker      15
5  Cleveland  Defense + Kicker      35

提前致谢!

【问题讨论】:

    标签: python pandas dataframe append aggregate


    【解决方案1】:

    我们可以使用groupby agg 创建汇总行,然后使用append 到DataFrame:

    df = df.append(df.groupby('Team', as_index=False).agg({
        'Position': ' + '.join,  # Concat Strings together
        'Points': 'sum'  # Total Points
    }), ignore_index=True)
    

    df:

            Team          Position  Points
    0    Atlanta           Defense       5
    1    Atlanta            Kicker      10
    2  Cleveland           Defense      15
    3  Cleveland            Kicker      20
    4    Atlanta  Defense + Kicker      15
    5  Cleveland  Defense + Kicker      35
    

    我们还可以通过在groupby 之前过滤df 来将某些职位列入白名单,以仅聚合所需的职位:

    whitelisted_positions = ['Kicker', 'Defense']
    df = df.append(
        df[df['Position'].isin(whitelisted_positions)]
            .groupby('Team', as_index=False).agg({
            'Position': ' + '.join,  # Concat Strings together
            'Points': 'sum'  # Total Points
        }), ignore_index=True
    )
    

    【讨论】:

    • 这很好用,谢谢。我意识到我遗漏了一个关键因素——还有其他职位。我该如何做到这一点,以便这种聚合只发生在位置“防御”和“踢球者”上,但忽略位置等于另一个值的行?
    • 只在 groupby 之前过滤。查看更新的代码块
    猜你喜欢
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多