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

如何在Pandas中按3列分组,基于组内首个日期年份统计组合频次

解决方法

要实现这个按分组划分年份Bin并统计次数的需求,咱们用Pandas一步步来操作就行:

步骤拆解与代码实现

1. 预处理日期数据

首先得把字符串格式的date转换成可处理的datetime类型,再提取出年份——这是后续分组统计的基础。

2. 分组获取基准年份

按x、y、z分组后,取每组里最早的年份作为Bin划分的起始基准。

3. 划分年份Bin(level)

从你的示例结果来看,Bin是按每2年一个区间划分的:起始年份所在的2年区间为level1,下一个2年区间为level2,以此类推。咱们可以通过年份差的整数除法来实现这个划分。

4. 统计每组每个level的出现次数

最后按x、y、z、level再次分组,统计每组的记录数。

import pandas as pd

# 加载示例数据
data = {
    'x': [1, 1, 1, 1],
    'y': [2, 3, 2, 2],
    'z': [2, 2, 2, 2],
    'date': ['08-12-2016 00:00', '24-03-2017 00:00', '22-04-2017 00:00', '22-04-2019 00:00']
}
df = pd.DataFrame(data)

# 转换日期格式并提取年份
df['date'] = pd.to_datetime(df['date'], format='%d-%m-%Y %H:%M')
df['year'] = df['date'].dt.year

# 按x、y、z分组,获取每组的起始年份(最早年份)
df['start_year'] = df.groupby(['x', 'y', 'z'])['year'].transform('min')

# 计算level:每2年一个Bin,可根据需求调整除数
df['level'] = ((df['year'] - df['start_year']) // 2) + 1

# 统计每组每个level的出现次数
result = df.groupby(['x', 'y', 'z', 'level']).size().reset_index(name='count')

print(result)

代码说明

  • 日期处理:用pd.to_datetime解析字符串日期,dt.year提取年份,确保后续年份计算准确。
  • 基准年份获取:transform('min')能让每组的每条记录都带上组内的最早年份,方便后续计算年份差。
  • level划分:(year - start_year) // 2 + 1的逻辑是:年份差0-1归为level1,差2-3归为level2,以此类推。如果需要1年一个Bin,把除数改成1就行。
  • 统计次数:groupby(...).size()直接统计每组的记录数,reset_index把结果转换成规整的DataFrame格式。

运行结果

执行代码后会得到和你期望完全一致的输出:

x  y  z  level  count
0  1  2  2      1      2
1  1  2  2      2      1
2  1  3  2      1      1

如果你的Bin划分逻辑不是固定间隔(比如连续无断层的年份为一个level),随时说,我再调整代码~

内容的提问来源于stack exchange,提问作者mimaku

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:22:40