如何使用Pandas的groupby实现按日和类别生成时间维度计数向量?
解决按分组生成指定时间范围计数值向量的问题
我来帮你搞定这个需求!要实现按day和category分组,生成时间范围1到10的计数值向量(缺失时间补0),用Pandas可以轻松完成,下面是具体实现步骤:
1. 准备示例数据
首先先构造你提供的示例DataFrame:
import pandas as pd df = pd.DataFrame({ 'day': [1,1,1,1,1,2,2,2,2,2], 'time': [1,2,3,5,6,7,2,1,4,6], 'category': ['a']*10, 'count': [13,47,1,2,4,14,10,9,2,1] })
2. 定义完整时间范围
根据你的要求,时间范围是1到10,我们先生成这个完整的时间序列:
min_time = 1 max_time = 10 full_time = pd.RangeIndex(min_time, max_time + 1) # 生成1到10的连续索引
3. 分组生成目标向量
这里提供两种简洁的实现方式:
方法一:使用groupby.apply(推荐)
通过分组后对每个组重索引补全时间,再转成列表:
result = df.groupby(['day', 'category']).apply( lambda group: ( group.set_index('time') .reindex(full_time)['count'] .fillna(0) .astype(int) .tolist() ) ).reset_index(name='count')
代码解释:
groupby(['day', 'category']):按指定的两个维度分组- 对每个分组:
set_index('time'):把time列设为索引,方便后续重索引reindex(full_time):将分组的索引补全为1到10,缺失的时间对应的count会变成NaNfillna(0):把缺失值替换为0astype(int):确保计数值是整数类型tolist():将补全后的count列转成列表
reset_index(name='count'):把分组的索引还原成列,并给列表列命名为count
方法二:使用pivot_table
先做透视表补全时间列,再转成列表:
# 生成透视表,缺失的time自动补0 pivot_df = df.pivot_table( index=['day', 'category'], columns='time', values='count', fill_value=0 ) # 确保所有1-10的时间列都存在,缺失的列补0 for time_val in full_time: if time_val not in pivot_df.columns: pivot_df[time_val] = 0 # 按时间顺序排序列,再转成列表 result = pivot_df.reindex(columns=full_time).apply(list, axis=1).reset_index(name='count')
4. 查看结果
运行代码后,打印result就能得到你想要的输出:
print(result)
输出结果:
day category count 0 1 a [13, 47, 1, 0, 2, 4, 0, 0, 0, 0] 1 2 a [9, 10, 0, 2, 0, 1, 14, 0, 0, 0]
内容的提问来源于stack exchange,提问作者dagrun
相关产品推荐
相关产品推荐

