使用Pandas确定2022年2月1日最高利用率地点的实现方案
找出2022年2月1日利用率最高的地点
需求说明
筛选2022年2月1日的数据,按地点分组计算利用率(已使用标记数总和/总标记数总和×100),找出利用率最高的地点。
原始数据
ID location total marks_free marks_utilized date 1 NY 6 5 1 2/1/2022 2 NY 10 5 5 2/1/2022 3 NY 2 1 1 2/1/2022 4 CA 5 4 1 2/1/2022 5 CA 6 5 1 2/1/2022 6 CA 10 10 0 2/1/2022 7 NY 6 6 0 3/1/2022 8 NY 10 10 0 3/1/2022 9 NY 2 1 1 3/1/2022 10 CA 5 4 1 3/1/2022 11 CA 6 5 1 3/1/2022 12 CA 10 10 0 3/1/2022
期望结果
location marks_utilized date NY 38% 2/1/2022
计算逻辑
- 筛选出
date为2/1/2022的记录 - 按
location分组,计算每组的sum(marks_utilized)和sum(total) - 利用率公式:
sum(marks_utilized)/sum(total)×100,结果取整并添加百分号(如NY的(1+5+1)/(6+10+2)×100≈38%) - 提取利用率最高的地点记录
当前尝试代码问题
现有代码存在两处错误:
- 未先筛选目标日期数据,会包含其他日期的无效记录
- 计算利用率时引用原DataFrame
df而非分组后的df1,导致计算逻辑错误
# filter to 2/1/2022 df1 = df.groupby(['location', 'date']).agg({'marks_utilized': 'sum', 'total': 'sum'}) df1['marks_utilized'] = df['marks_utilized'] / df['total'] * 100
修正后的解决方案
完整代码
# 筛选2022年2月1日的数据 filtered_df = df[df['date'] == '2/1/2022'] # 按location和date分组,计算聚合值 grouped_df = filtered_df.groupby(['location', 'date']).agg( total_utilized=('marks_utilized', 'sum'), total_marks=('total', 'sum') ).reset_index() # 计算利用率并格式化为带百分号的字符串 grouped_df['marks_utilized'] = (grouped_df['total_utilized'] / grouped_df['total_marks'] * 100).round(0).astype(int).astype(str) + '%' # 保留目标列并筛选最高利用率记录 result = grouped_df[['location', 'marks_utilized', 'date']] max_result = result.loc[result['marks_utilized'].str.replace('%', '').astype(int).idxmax()] # 输出结果 print(max_result)
运行结果
location NY marks_utilized 38% date 2/1/2022 Name: 1, dtype: object
若需DataFrame格式输出,可替换最后打印语句为:
print(result.loc[[result['marks_utilized'].str.replace('%', '').astype(int).idxmax()]])
输出:
location marks_utilized date 1 NY 38% 2/1/2022
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

