基于客户与月份条件在Pandas中计算time_spent_ratio
解决Pandas计算手机与平板使用时长比值的问题
我来帮你实现这个需求,核心思路是先把同一月份、同一用户的手机和平板时长放在同一行,然后直接做除法运算即可。
步骤1:构造示例数据(模拟你的主表)
首先我们先把你提供的主表数据转换成Pandas DataFrame:
import pandas as pd # 模拟你的主表数据 data = { 'date_month': ['01-01-19', '01-01-19', '01-02-19', '01-02-19', '01-03-19', '01-03-19'], 'customer_id': [2, 2, 2, 2, 2, 2], 'device_name': ['phone', 'tablet', 'phone', 'tablet', 'phone', 'tablet'], 'time_spent': [140, 232, 159, 210, 193, 190] } df = pd.DataFrame(data)
步骤2:重塑数据并计算比值
这里推荐使用pivot_table方法,它能快速把device_name的不同类别(phone/tablet)转为列,让我们可以直接做除法:
# 重塑数据:将date_month和customer_id作为索引,device_name转为列,值为time_spent pivoted_df = df.pivot_table( index=['date_month', 'customer_id'], columns='device_name', values='time_spent', aggfunc='sum' # 若同一设备有多个记录,sum会自动合并时长;如果只有单条记录,用first也可以 ).reset_index() # 计算手机/平板的时长比值,可根据需求调整小数位数 pivoted_df['time_spent_ratio'] = (pivoted_df['phone'] / pivoted_df['tablet']).round(4) # 提取目标列,得到最终结果 final_result = pivoted_df[['date_month', 'customer_id', 'time_spent_ratio']] print(final_result)
输出结果
运行上述代码后,你会得到和期望高度匹配的输出:
date_month customer_id time_spent_ratio 0 01-01-19 2 0.6034 1 01-02-19 2 0.7571 2 01-03-19 2 1.0158
(注:如果需要和你期望的小数位数完全一致,比如前两位保留3位小数,最后一位保留4位,可以单独处理,或者直接调整round()的参数)
另一种实现方式(groupby + unstack)
如果你更习惯用groupby,也可以这样写:
# 按月份、用户、设备分组求和,再将设备转为列 grouped_df = df.groupby(['date_month', 'customer_id', 'device_name'])['time_spent'].sum().unstack('device_name').reset_index() # 计算比值 grouped_df['time_spent_ratio'] = grouped_df['phone'] / grouped_df['tablet'] # 提取目标列 final_result = grouped_df[['date_month', 'customer_id', 'time_spent_ratio']].round(4)
这个逻辑和pivot_table是一致的,两种方法都能实现你的需求,你可以根据自己的习惯选择。
内容的提问来源于stack exchange,提问作者user12625679
相关产品推荐
相关产品推荐

