如何使用Pandas按多条件分组数据?含季节与工作日/周末分组需求
按季节+工作日/周末分组处理时间序列数据
作为新手,别担心,我们用Python的pandas库就能轻松完成这个需求,步骤非常清晰,我会一步步给你讲解:
步骤1:准备工作和导入数据
首先确保你已经安装了pandas,如果没安装的话,先在终端运行:
pip install pandas
然后加载你的数据,假设你的数据是CSV格式(如果是Excel文件,用pd.read_excel()替换即可):
import pandas as pd # 这里用你提供的样本数据做示例,实际使用时替换成你的文件路径 data = pd.DataFrame({ 'timestamp': ['2017-01-01 00:00', '2017-01-01 01:00', '2017-01-01 02:00', '2017-01-01 03:00', '2017-01-01 04:00'], 'date': ['01/01/2017', '01/01/2017', '01/01/2017', '01/01/2017', '01/01/2017'], 'month': ['Jan', 'Jan', 'Jan', 'Jan', 'Jan'], 'day': ['Sun', 'Sun', 'Sun', 'Sun', 'Sun'], 'hour': ['00:00', '01:00', '02:00', '03:00', '04:00'], 'price': [60.23, 60.73, 75.99, 60.76, 49.01] }) # 把timestamp列转换成datetime类型,这是处理时间数据的核心前提 data['timestamp'] = pd.to_datetime(data['timestamp'])
步骤2:定义季节规则
根据你的需求,Winter包含11、12、1、2月,我们用一个映射字典来给每个日期分配对应的季节:
# 月份数字到季节名称的映射 season_map = { 11: 'Winter', 12: 'Winter', 1: 'Winter', 2: 'Winter', 3: 'Spring', 4: 'Spring', 5: 'Spring', 6: 'Summer', 7: 'Summer', 8: 'Summer', 9: 'Autumn', 10: 'Autumn' } # 从timestamp中提取月份数字,再映射到季节 data['season'] = data['timestamp'].dt.month.map(season_map)
步骤3:区分工作日和周末
pandas的dt.dayofweek会返回0(周一)到6(周日)的数字,我们用这个来判断是否是周末:
# 判断是否为周末:5代表周六,6代表周日 data['is_weekend'] = data['timestamp'].dt.dayofweek.isin([5, 6]) # 转换成你需要的文本标签:Weekend/Weekday data['day_type'] = data['is_weekend'].map({True: 'Weekend', False: 'Weekday'})
步骤4:组合分组标签
把季节和工作日/周末组合成你要的格式,比如"Weekend_Winter":
data['group_label'] = data['day_type'] + '_' + data['season']
现在你的数据里已经有了group_label列,每一行都对应了所属的分组。
步骤5:按分组进行聚合分析
接下来你可以按这个分组标签做各种统计,比如计算每个分组的平均价格、总价格等:
# 计算每个分组的平均价格 grouped_avg_price = data.groupby('group_label')['price'].mean() print("各分组平均价格:") print(grouped_avg_price) # 如果需要查看某个分组的原始数据,比如Weekend_Winter winter_weekend_data = data.groupby('group_label').get_group('Weekend_Winter') print("\n冬季周末的原始数据:") print(winter_weekend_data)
完整代码汇总
把上面的步骤整合起来,就是可以直接运行的完整代码:
import pandas as pd # 加载数据(实际使用时替换为你的数据文件路径) data = pd.DataFrame({ 'timestamp': ['2017-01-01 00:00', '2017-01-01 01:00', '2017-01-01 02:00', '2017-01-01 03:00', '2017-01-01 04:00'], 'date': ['01/01/2017', '01/01/2017', '01/01/2017', '01/01/2017', '01/01/2017'], 'month': ['Jan', 'Jan', 'Jan', 'Jan', 'Jan'], 'day': ['Sun', 'Sun', 'Sun', 'Sun', 'Sun'], 'hour': ['00:00', '01:00', '02:00', '03:00', '04:00'], 'price': [60.23, 60.73, 75.99, 60.76, 49.01] }) # 转换时间列格式 data['timestamp'] = pd.to_datetime(data['timestamp']) # 分配季节标签 season_map = {11:'Winter',12:'Winter',1:'Winter',2:'Winter',3:'Spring',4:'Spring',5:'Spring',6:'Summer',7:'Summer',8:'Summer',9:'Autumn',10:'Autumn'} data['season'] = data['timestamp'].dt.month.map(season_map) # 区分工作日/周末 data['day_type'] = data['timestamp'].dt.dayofweek.isin([5,6]).map({True:'Weekend',False:'Weekday'}) # 生成最终分组标签 data['group_label'] = data['day_type'] + '_' + data['season'] # 分组统计示例 grouped_avg = data.groupby('group_label')['price'].mean() print("各分组平均价格:") print(grouped_avg)
这样运行后,你就能得到完全符合需求的分组结果啦!如果你的数据是从CSV文件读取的,只需要把pd.DataFrame(...)换成pd.read_csv('你的文件路径.csv')即可。
内容的提问来源于stack exchange,提问作者tp_1290
相关产品推荐
相关产品推荐

