如何使用pandas查找每日数值最高行并计算对应分类占比
pandas实现需求的完整方案
步骤1:数据预处理
读取数据后先完成格式转换,同时计算每行三个分类的数值总和,作为判断小时峰值的依据:
import pandas as pd # 读取数据,可替换为你自己的数据源读取逻辑 df = pd.read_csv("你的数据文件路径.csv") # 将date列转为datetime格式 df['date'] = pd.to_datetime(df['date']) # 提取日期部分作为分组维度 df['date_day'] = df['date'].dt.date # 计算每行三个分类的总和 df['total'] = df[['CAT_A', 'CAT_B', 'CAT_C']].sum(axis=1)
步骤2:筛选每日总和最高的小时行
按天分组后取总和列最大值对应的索引,直接定位到目标行:
# 按天分组,取total列最大值对应的行索引 max_idx = df.groupby('date_day')['total'].idxmax() # 取出所有峰值行 peak_hour_df = df.loc[max_idx].reset_index(drop=True)
可选补充:如果需要保留同一天所有总和同为最大值的小时行,可以将上述代码替换为:
df['day_max_total'] = df.groupby('date_day')['total'].transform('max') peak_hour_df = df[df['total'] == df['day_max_total']].reset_index(drop=True)
步骤3:计算三个分类的占比
对峰值行的三个分类值做归一化计算,转为百分比格式:
# 计算各分类占比,可按需调整保留小数位数 peak_hour_df['CAT_A占比'] = (peak_hour_df['CAT_A'] / peak_hour_df['total'] * 100).round(2).astype(str) + '%' peak_hour_df['CAT_B占比'] = (peak_hour_df['CAT_B'] / peak_hour_df['total'] * 100).round(1).astype(str) + '%' peak_hour_df['CAT_C占比'] = (peak_hour_df['CAT_C'] / peak_hour_df['total'] * 100).round(1).astype(str) + '%' # 可仅保留需要的输出列 result_df = peak_hour_df[['date', 'CAT_A占比', 'CAT_B占比', 'CAT_C占比']] print(result_df.head())
运行后你给出的示例数据(1月1日5点的12、223、155)会输出对应占比:CAT_A:3.08%、CAT_B:57.2%、CAT_C:39.7%,和你预期的结果一致。
内容的提问来源于stack exchange,提问作者Ducks_on_the_go
相关产品推荐
相关产品推荐

