基于过滤器的列计算?

Posted

技术标签:

【中文标题】基于过滤器的列计算?【英文标题】: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() 【参考方案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

【讨论】:

以上是关于基于过滤器的列计算?的主要内容,如果未能解决你的问题,请参考以下文章

我想创建触发器来更新基于多个字符串过滤器的列中插入或更新的值

hbase 多条件查询or 怎么过滤掉不需要查的列

无法按 DataTable 中的列显示过滤器

Oracle:基于过滤器的默认列值

过滤与分区列相关的列时的 Databricks 查询性能

从VBA中的过滤器中提取唯一值的集合