Pandas提供了强大的分组聚合功能,可以轻松进行条件分组计算和统计。本文通过一个例子,展示如何使用Pandas的`.groupby()`和`.agg()`方法进行条件分组计算。
准备数据
假设有这样一个字典数据:
dict = {
'姓名': ['张三','李四','王五','赵六'],
'1月':['100','150','200','300'],
'2月':['150','250','300','400'],
'3月':['200','250','300','500'],
'4月':['150','300','200','400'],
'5月':['200','100','300','200'],
'6月':['200','100','300','200'],
'7月':['200','100','300','200'],
}
我们要根据这个数据计算得到这样一个结果:
姓名 销售额大于200的月份数量 销售额大于300的月份数量
0 张三 3.0 1.0
1 李四 3.0 2.0
2 王五 4.0 3.0
3 赵六 5.0 4.0
分组和聚合
可以这样实现:
df = pd.DataFrame(dict)
# 分组bys姓名
grouped = df.groupby('姓名')
# 销售额大于200的月份数量
cnt1 = grouped['1月'].agg(lambda x: (x>200).sum())
# 销售额大于300的月份数量
cnt2 = grouped['1月'].agg(lambda x: (x>300).sum())
# 合并两个Series,重命名列
result = pd.concat([cnt1, cnt2], axis=1).rename(columns={0:'销售额大于200的月份数量',1:'销售额大于300的月份数量'})
print(result)
1. 使用`df.groupby('姓名')`根据'姓名'列进行分组
2. 使用`.agg()`和匿名函数`lambda x: (x>200).sum()`计算每组的销售额大于200的月份数量
3. 同理计算销售额大于300的月份数量
4. 使用`pd.concat()`将两个Series合并,并重命名列
5. 最终得到所需的结果DataFrame