求助:基于Pandas/Python实现数据聚合与大小分级逻辑
Pandas 数据分组处理实现方案
核心实现代码
我们可以利用 Pandas 的分组(groupby)功能结合自定义处理函数完成需求,无需手动循环:
import pandas as pd # 示例数据 df = pd.DataFrame({'priority': [1, 1, 1, 2, 2, 3], 'db_name': ['corp', 'corp', 'corp', 'sales', 'sales', 'market'], 'tbl_name': ['c_tbl1', 'c_tbl1', 'c_tbl1', 's_tbl1', 's_tbl2', 'm_tbl1'], 'partition': ['202301', '202302', '202303', '202301', '202302', '202301'], 'size_gb': [5, 5, 10, 1, 2, 3]}) def process_group(group): # 提取分组的基础标识信息 priority = group['priority'].iloc[0] db = group['db_name'].iloc[0] tbl = group['tbl_name'].iloc[0] if priority == 1: # 优先级1分组:输出单个条目,t_size固定为XL return pd.DataFrame({ 'priority': [priority], 'db_name': [db], 'tbl_name': [tbl], 'total_size_gb': [group['size_gb'].sum()], 't_size': ['XL'] }) else: # 其他优先级:计算总大小后判断t_size total_size = group['size_gb'].sum() t_size = 'S' if total_size < 3 else 'M' return pd.DataFrame({ 'priority': [priority], 'db_name': [db], 'tbl_name': [tbl], 'total_size_gb': [total_size], 't_size': [t_size] }) # 按指定维度分组并应用处理逻辑 result = df.groupby(['priority', 'db_name', 'tbl_name'], as_index=False).apply(process_group).reset_index(drop=True) print(result)
代码逻辑说明
- 分组规则:按
priority、db_name、tbl_name三个字段分组,确保同优先级、同库同表的条目被归为一组。 - 优先级1处理:直接生成单个汇总条目,计算组内总大小,
t_size固定标记为XL。 - 其他优先级处理:先计算组内总大小,根据总大小是否小于3GB,分别标记为
S或M。 - 结果整合:通过
apply执行分组逻辑,再用reset_index将各组结果合并为最终的结构化DataFrame。
运行输出结果
priority db_name tbl_name total_size_gb t_size 0 1 corp c_tbl1 20 XL 1 2 sales s_tbl1 1 S 2 2 sales s_tbl2 2 S 3 3 market m_tbl1 3 M
内容的提问来源于stack exchange,提问作者Alex_python
相关产品推荐
相关产品推荐

