如何在Pandas中按区域和时间分组批量插入数值?
停车场时段费率批量插入解决方案
核心思路
无需依赖分组操作,先从时间字段提取小时信息,再通过预设的「区域-时段」费率规则批量赋值,比分组更直接高效。
步骤1:提取时间小时数
先确保OccupancyDateTime是datetime类型,再从中提取小时用于判断时段:
# 转换为datetime类型(若未处理过) df_parking['OccupancyDateTime'] = pd.to_datetime(df_parking['OccupancyDateTime']) # 新增小时列 df_parking['hour'] = df_parking['OccupancyDateTime'].dt.hour
步骤2:定义费率规则并批量赋值
根据需求选择合适的实现方式:
方式一:条件列表赋值(适合规则较少的场景)
import numpy as np # 定义匹配条件与对应费率 conditions = [ # FirstHill 早8:00-11:00(包含8点,不包含11点,对应hour=8,9,10) (df_parking['PaidParkingArea'] == 'FirstHill') & (df_parking['hour'].between(8, 10)), # 可继续添加其他区域规则,比如Downtown午间时段 (df_parking['PaidParkingArea'] == 'Downtown') & (df_parking['hour'].between(11, 17)), # 默认无费率场景 True ] rates = [0.5, 1.0, 0.0] # 批量生成费率列 df_parking['ParkingRate'] = np.select(conditions, rates)
方式二:字典映射赋值(适合多区域、多时段的复杂规则)
先定义区域费率映射,再通过自定义函数匹配:
# 定义区域-时段费率字典,键为区域名,值为(时段起始, 时段结束):费率 area_rate_mapping = { 'FirstHill': { (8, 11): 0.5, (11, 18): 0.8, (18, 24): 0.3, (0, 8): 0.0 }, 'CapitolHill': { (7, 12): 0.6, (12, 19): 0.9, (19, 24): 0.4, (0, 7): 0.0 } } # 自定义匹配函数 def match_parking_rate(row): area = row['PaidParkingArea'] hour = row['hour'] # 遍历当前区域的时段规则 for (start_hour, end_hour), rate in area_rate_mapping.get(area, {}).items(): if start_hour <= hour < end_hour: return rate return 0.0 # 无匹配规则时返回默认费率 # 批量生成费率列 df_parking['ParkingRate'] = df_parking.apply(match_parking_rate, axis=1)
补充说明
你之前使用的df_parking.groupby(['PaidParkingArea','OccupancyDateTime'])主要用于分组统计(比如各时段停车数量),而批量赋值费率更适合直接通过行级的「区域+时段」匹配实现,无需分组操作。
内容的提问来源于stack exchange,提问作者samita
相关产品推荐
相关产品推荐

