You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于客户与月份条件在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:17:32