【问题标题】:Calculations of a column based on filter?基于过滤器的列计算?
【发布时间】:2020-01-18 20:37:35
【问题描述】:

我正在尝试找出一种方法,通过过滤不同的或 2 个不同的列来计算 df 中列的总和。

ID | Shift |Valid |Amount
B     AM      NO    23.22
E     PM      YES   231.23
D     AM      YES   443.12
R     Both    NO    43.12
T     PM      NO    111.12

我想过滤像

这样的 Shift 列

df[(df['shift'] == 'PM')]并计算金额列的总和

我想为 AM、PM、Both 尝试几次,而不是为每个列创建新的 dfs,然后对金额列求和。

另外,如果我还想过滤 valid 列并计算金额列的总和而不创建新的 df,这也可能吗?

谢谢!

【问题讨论】:

  • df['Amount'][(df['shift'] == 'PM')].sum()

标签: python python-3.x pandas data-science data-analysis


【解决方案1】:

如果我正确理解您的问题,请给出以下数据框:

df = pd.DataFrame({'Shift': ['AM', 'PM', 'AM', 'PM', 'Both'], 'Valid':['YES','NO','YES','NO','YES'],'Amount': [3, 8, 4, 5, 100]})

  Shift Valid  Amount
0    AM   YES       3
1    PM    NO       8
2    AM   YES       4
3    PM    NO       5
4  Both   YES     100

您可以使用loc 方法过滤数据框:

df.loc[(df['Shift'] == 'AM') & (df['Valid'] == 'YES')]['Amount'].sum()
# output: 7

这样,数据框的列被过滤"Shift""Valid""Amount"的值相加

或者,您可以使用groupby 命令一次性获取所有结果:

df.groupby(['Valid','Shift'])['Amount'].sum()

Valid  Shift
NO     PM        13
YES    AM         7
       Both     100
Name: Amount, dtype: int64

这样,dataframe的所有列都分组"Shift""Valid""Amount"的值加在一起。

【讨论】:

    【解决方案2】:
    df[df['shift'] == 'PM']['Amount'].sum()
    

    【讨论】:

      【解决方案3】:

      您可以使用DataFrame.Groupby 并使用一列或多列组成组:

      shift_sum=df.groupby('Shift')['Amount'].sum()
      print(shift_sum)
      
      Shift
      AM      466.34
      Both     43.12
      PM      342.35
      Name: Amount, dtype: float64
      

      这样您就可以直接得到AMPMBoth 的总和。

      之后,如果您愿意,您可以只选择“AM”总和值:

      shift_sum['PM']
      
      342.25
      

      你可以用同样的方法添加基于valid

      df.groupby('Valid')['Amount'].sum()
      
      Valid
      NO     177.46
      YES    674.35
      Name: Amount, dtype: float64
      

      即使你可以将两者结合起来:

      df.groupby(['Valid','Shift'])['Amount'].sum()
      Valid  Shift
      NO     AM        23.22
             Both      43.12
             PM       111.12
      YES    AM       443.12
             PM       231.23
      Name: Amount, dtype: float64
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 2021-01-12
        • 1970-01-01
        • 1970-01-01
        • 2021-10-19
        • 2023-03-14
        相关资源
        最近更新 更多