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

如何使用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会变成NaN
    • fillna(0):把缺失值替换为0
    • astype(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:23:42