python - 根据条件对 groupby 的值求和
问题描述
我正在处理一些旧的 kagle 竞赛的数据集,
我想从其中一张表中进行一些聚合:
要知道哪一天的折扣更大,我的预期输出是这样的:
为此,我尝试使用以下代码:
coupon_list[[ 'USABLE_DATE_MON', 'USABLE_DATE_TUE', 'USABLE_DATE_WED',
'USABLE_DATE_THU', 'USABLE_DATE_FRI', 'USABLE_DATE_SAT',
'USABLE_DATE_SUN','DISCOUNT_PRICE']].melt("DISCOUNT_PRICE").groupby("variable").agg({"DISCOUNT_PRICE":sum,"value":sum})
但是对于该聚合,disscount_price 是所有表的平均值,而不是每天的平均值。
为了解决这个问题,我创建了一个新表:
coupon_list_usable["DISCOUNT_PRICE"] = coupon_list_usable.apply(lambda x: x.DISCOUNT_PRICE if x.value==1 else 0,axis=1 )
coupon_list_usable.groupby("variable").agg({"DISCOUNT_PRICE":sum,"value":sum}).reset_index()[["variable","DISCOUNT_PRICE"]].set_index("variable").plot.bar()
但这不是一个pythonic解决方案,是否可以在 groupby 本身中做到这一点?
解决方案
使用query
forfor 过滤行1
和用于聚合使用GroupBy.sum
:
注意:dropna
这里不能使用,因为2
天数列的数据中也有值。
s = (coupon_list.melt("DISCOUNT_PRICE")
.query('value == 1')
.groupby("variable")['DISCOUNT_PRICE']
.sum())
s.plot.bar()
您还可以使用sreindex
或通过ordered Categorical
s 更改天数的顺序:
days = ['USABLE_DATE_MON', 'USABLE_DATE_TUE', 'USABLE_DATE_WED',
'USABLE_DATE_THU', 'USABLE_DATE_FRI', 'USABLE_DATE_SAT',
'USABLE_DATE_SUN']
s = (coupon_list.melt("DISCOUNT_PRICE")
.query('value == 1')
.groupby("variable")['DISCOUNT_PRICE']
.sum()
.reindex(days))
days = ['USABLE_DATE_MON', 'USABLE_DATE_TUE', 'USABLE_DATE_WED',
'USABLE_DATE_THU', 'USABLE_DATE_FRI', 'USABLE_DATE_SAT',
'USABLE_DATE_SUN']
s = (coupon_list.melt("DISCOUNT_PRICE", var_name='days', value_name='data')
.assign(days = lambda x: pd.Categorical(x['days'],
ordered=True,
categories=days))
.query('value == 1')
.groupby("days")['DISCOUNT_PRICE']
.sum())
样品:
coupon_list = pd.DataFrame({
'USABLE_DATE_MON':[np.nan,np.nan,np.nan,1,1,np.nan],
'USABLE_DATE_TUE':[1,np.nan,1,np.nan,1,np.nan],
'USABLE_DATE_WED':[1,np.nan,np.nan,np.nan,1,1],
'USABLE_DATE_THU':[1,1,np.nan,1,1,np.nan],
'USABLE_DATE_FRI':[np.nan,1,2,np.nan,1,np.nan],
'USABLE_DATE_SAT':[1,1,np.nan,1,1,2],
'USABLE_DATE_SUN':[1,np.nan,1,1,1,1],
'DISCOUNT_PRICE':[2,3,6,2,2,4],
})
print (coupon_list)
USABLE_DATE_MON USABLE_DATE_TUE USABLE_DATE_WED USABLE_DATE_THU \
0 NaN 1.0 1.0 1.0
1 NaN NaN NaN 1.0
2 NaN 1.0 NaN NaN
3 1.0 NaN NaN 1.0
4 1.0 1.0 1.0 1.0
5 NaN NaN 1.0 NaN
USABLE_DATE_FRI USABLE_DATE_SAT USABLE_DATE_SUN DISCOUNT_PRICE
0 NaN 1.0 1.0 2
1 1.0 1.0 NaN 3
2 2.0 NaN 1.0 6
3 NaN 1.0 1.0 2
4 1.0 1.0 1.0 2
5 NaN 2.0 1.0 4
days = ['USABLE_DATE_MON', 'USABLE_DATE_TUE', 'USABLE_DATE_WED',
'USABLE_DATE_THU', 'USABLE_DATE_FRI', 'USABLE_DATE_SAT',
'USABLE_DATE_SUN']
s = (coupon_list.melt("DISCOUNT_PRICE", var_name='days', value_name='data')
.assign(days = lambda x: pd.Categorical(x['days'],
ordered=True,
categories=days))
.query('data == 1')
.groupby("days")['DISCOUNT_PRICE']
.sum())
print (s)
days
USABLE_DATE_MON 4
USABLE_DATE_TUE 10
USABLE_DATE_WED 8
USABLE_DATE_THU 9
USABLE_DATE_FRI 5
USABLE_DATE_SAT 9
USABLE_DATE_SUN 16
Name: DISCOUNT_PRICE, dtype: int64
s.plot.bar()
推荐阅读
- angular - Angular - 仅当 URL 参数存在时如何执行查询
- javascript - 如何更改 Javascript 上的点击选项以在移动设备上工作?
- powershell - 如果之后抛出错误,则数组的 Powershell 写入输出会丢失
- amazon-web-services - 通过 AWS CloudFront 从单个 S3 存储桶为 SPA 多租户提供服务
- css - 为什么 Bootstrap 4.5 断点在我的 CSS 中不起作用?
- java - 想知道如何通过单击按钮为我重定向任何特定页面的期限确定期限吗?
- api - 在 webforms 中处理从 api 系统返回的 html 内容
- javascript - 让消息在几秒钟后消失
- adaptive-cards - 自适应卡片 Action.OpenURL 跟踪
- java - 为什么我不能用类对象访问java中的内部静态类