【问题标题】:How can I filter data frame rows and save the sum in new row?如何过滤数据框行并将总和保存在新行中?
【发布时间】:2021-10-31 16:55:33
【问题描述】:
  • 我想合并所有分数列小于 63 的行,

  • 然后取出所有的一些并将它们保存在一个新行中,我们可以称之为“新总和”,它将是所有分数小于或等于 63 的分数的总和。

  • 删除包含小于 63 的值的列。

  • 我正在使用熊猫。

  • 请看附图

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以这样做:

    df.loc[len(df)] = ['Other', "", df[df['Score'] < 63]['Score'].sum(), ""]
    

    如果你想删除Score

    df.drop(df[df['Score'] < 63].index, inplace=True)
    

    注意:选项inplace=True 永久更改DataFrame。如果您不希望将更改永久应用于DataFrame,请省略此选项,例如

    new_df = df.drop(df[df['Score'] < 63].index)
    

    演示:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({
        'Name': ['Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby', 'Cathrine', 'Alisa', 'Bobby',
                 'Cathrine'],
        'Subject': ['Mathematics', 'Mathematics', 'Mathematics', 'Science', 'Science', 'Science', 'History', 'History',
                    'History', 'Economics', 'Economics', 'Economics'],
        'Score': [62, 47, 55, 74, 31, 77, 85, 63, 42, 62, 89, 85],
        'score-ranked': [7.5, 10.0, 9.0, 5.0, 12.0, 4.0, 2.5, 6.0, 11.0, 7.5, 1.0, 2.5]
    })
    
    df.loc[len(df)] = ['Other', "", df[df['Score'] < 63]['Score'].sum(), ""]
    
    df.drop(df[df['Score'] < 63].index, inplace=True)
    
    print(df)
    

    输出:

            Name    Subject  Score score-ranked
    3      Alisa    Science     74          5.0
    5   Cathrine    Science     77          4.0
    6      Alisa    History     85          2.5
    7      Bobby    History     63          6.0
    10     Bobby  Economics     89          1.0
    11  Cathrine  Economics     85          2.5
    12     Other               299   
    

    【讨论】:

    • 您好,我并不是要您删除您的答案 :-) 我看到您有时会回答正则表达式问题(这很棒),我只是想提出一些建议。
    • @Thefourthbird - 一如既往地感谢您的鼓励。不知何故,我只是在删除我的答案后才看到你的评论。我删除答案的原因是我对我的答案不满意:)。顺便说一句,您在评论中发布的解决方案很棒;请将其发布为答案。
    【解决方案2】:

    试试 df[df['分数'] > 63] df.groupby(['Name'])[Score].sum() 我写它作为答案,因为我不能评论

    【讨论】:

    • 谢谢Faika,但是不行,我想同时合并和drop。
    【解决方案3】:

    你可以使用pandas内置的Fancy indexing

    df = df[df['score'] < 30]
    df.loc[len(df.index)] = ["TOTAL","",sum(df['score']),""] 
    

    【讨论】:

    • 我想做点别的,不是df[df['Score'] > 63]
    • 检查是否是你想要的
    • 谢谢你,佩德罗,实际上,它是我想要的一部分,它是可行的,但我也想将它们全部结合起来,删除小于 63 的任何东西
    • 立即试用代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多