基于过滤器的列计算?
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
这样您就可以直接得到AM
、PM
和Both
的总和。
之后,如果您愿意,您可以只选择“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
【讨论】:
以上是关于基于过滤器的列计算?的主要内容,如果未能解决你的问题,请参考以下文章