基于按组划分日期的条件处理需求及对应数据集提交
按日期分组处理数据集的实用方案
嘿,我看你需要基于日期分组来处理这份带用户和数值的数据集,用Python的pandas就能轻松搞定,下面是一步步的实操方法:
1. 先把原始数据规整成可处理的格式
你的原始数据里E列看起来是空格分隔的两个数值,先把它拆成单独的列,方便后续计算:
import pandas as pd # 把你给的原始数据转成列表 data = [ [0, '2002-01-12', '2018-04-25 10:00:00', 'John', '19 19'], [1, '2002-01-12', '2018-04-25 11:00:00', 'John', '6 25'], [2, '2002-01-13', '2018-04-25 09:00:00', 'John', '5 30'], [3, '2002-01-13', '2018-04-25 11:00:00', 'John', '-25 5'], [4, '2002-01-14', '2018-04-25 11:00:00', 'John', '1 6'], [5, '2002-01-14', '2018-04-25 12:00:00', 'John', '44 50'], [6, '2002-01-25', '2018-04-25 11:00:00', 'George', '18 18'], [7, '2002-01-25', '2018-04-25 12:00:00', 'George', '12 30'], [8, '2002-01-26', '2018-04-25 11:00:00', 'George', '-8 22'], [9, '2002-01-26', '2018-04-25 12:00:00', 'George', '-10 12'], [10, '2002-01-27', '2018-04-25 10:00:00', 'George', '13 25'] ] # 创建DataFrame,给列命名 df = pd.DataFrame(data, columns=['A', 'B', 'C', 'D', 'E']) # 拆分E列成两个数值列,删掉原来的E列 df[['E1', 'E2']] = df['E'].str.split(' ', expand=True).astype(int) df.drop('E', axis=1, inplace=True)
2. 按单一日期维度分组(只看B列日期)
如果你只想按B列的日期来汇总数据,比如计算每天的E1、E2总和、平均值,代码如下:
# 按B列日期分组,指定要计算的聚合指标 grouped_by_date = df.groupby('B').agg( E1总和=('E1', 'sum'), E1平均值=('E1', 'mean'), E2总和=('E2', 'sum'), E2平均值=('E2', 'mean') ).reset_index() # 打印结果 print(grouped_by_date)
运行后就能得到每个日期对应的数值汇总,比如2002-01-12这天,John的E1总和是25,E2总和是44。
3. 按日期+用户双维度分组(更精准的分组)
因为数据里有John和George两个不同用户,同一日期下他们的数据是分开的,所以按日期+用户分组会更合理:
# 按B列日期和D列用户分组,统计总和和记录数 grouped_by_date_user = df.groupby(['B', 'D']).agg( E1累计=('E1', 'sum'), E2累计=('E2', 'sum'), 当日记录数=('A', 'count') ).reset_index() print(grouped_by_date_user)
这个结果会清晰展示每个用户在每一天的所有数据汇总,比如George在2002-01-26的E1累计是-18,E2累计是34,当天有2条记录。
4. 进阶:按周/月等周期分组
如果需要按更大的时间周期(比如月份、周)来分组,先把B列转成日期类型,再提取周期即可:
# 把B列转换成datetime格式,方便周期处理 df['B'] = pd.to_datetime(df['B']) # 按月份分组汇总 grouped_by_month = df.groupby(df['B'].dt.to_period('M')).agg( E1月度总和=('E1', 'sum'), E2月度总和=('E2', 'sum') ).reset_index() # 按周分组(周一为每周的第一天) grouped_by_week = df.groupby(df['B'].dt.isocalendar().week).agg( E1周度总和=('E1', 'sum'), E2周度总和=('E2', 'sum') ).reset_index()
小提示
如果你的需求不是聚合计算,而是其他操作(比如分组后填充缺失值、排序),可以用groupby之后的apply方法自定义函数来实现,灵活度很高。
内容的提问来源于stack exchange,提问作者Tie_24
相关产品推荐
相关产品推荐

