如何按地点分组计算苹果占比并转置Pandas DataFrame?
高效计算各地点苹果占比并重塑Pandas DataFrame格式
原始数据
import pandas as pd data = [['Location 1', 'Oranges', 9, 12, 5, 10, 7, 12], ['Location 1', 'Apples', 2, 6, 4, 3, 7, 2], ['Location 1', 'Total', 11, 18, 9, 13, 14, 14], ['Location 2', 'Oranges', 11, 8, 14, 8, 10, 9], ['Location 2', 'Apples', 5, 4, 6, 2, 9, 9], ['Location 2', 'Total', 16, 12, 20, 10, 19, 18]] df = pd.DataFrame(data, columns=['Location', 'Fruit', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'])
原始DataFrame结构:
Location Fruit Jan Feb Mar Apr May Jun 0 Location 1 Oranges 9 12 5 10 7 12 1 Location 1 Apples 2 6 4 3 7 2 2 Location 1 Total 11 18 9 13 14 14 3 Location 2 Oranges 11 8 14 8 10 9 4 Location 2 Apples 5 4 6 2 9 9 5 Location 2 Total 16 12 20 10 19 18
需求目标
按Location分组,计算每个地点每月苹果数量占总量的比例(Apples/Total),并将DataFrame重塑为以下格式:
Jan Feb Mar Location # of Apples % Fruit # of Apples % Fruit # of Apples % Fruit Location 1 2 18.2% 6 33.3% 4 44.4% Location 2 5 31.3% 4 33.3% 6 20.0%
高效解决方案
通过Pandas的分组、透视和重塑操作实现,无需手动定位行索引,适配任意数量的地点:
完整代码
# 1. 筛选苹果和总量数据,转为透视表 filtered = df[df['Fruit'].isin(['Apples', 'Total'])].pivot(index='Location', columns='Fruit') # 2. 定义所有月份,循环计算占比并转为百分比格式 months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'] for month in months: filtered[('% Fruit', month)] = (filtered[(month, 'Apples')] / filtered[(month, 'Total')]).apply(lambda x: f"{x*100:.1f}%") # 3. 构建目标列顺序,将每个月份的苹果数和占比配对 cols = [] for month in months: cols.append((month, 'Apples')) cols.append(('% Fruit', month)) # 4. 调整列结构和命名,匹配需求格式 result = filtered[cols].rename(columns={'Apples': '# of Apples'}, level=1) result.columns = pd.MultiIndex.from_tuples( [(month, col_name) for (col_type, month), col_name in result.columns], names=[None, None] ) # 5. 重置索引让Location成为显式列 result = result.reset_index()
代码说明
- 筛选+透视:直接提取苹果和总量数据,按地点和水果类型生成透视表,自动对齐每个地点的对应数据
- 循环计算占比:批量处理所有月份,避免重复代码,适配任意月份数量
- 列结构重组:通过自定义列顺序,将每个月份的苹果数和占比放在同一分组下,完美匹配需求格式
运行后输出的result就是目标格式的DataFrame,且无需手动处理行索引,自动适配所有地点。
内容的提问来源于stack exchange,提问作者be84
相关产品推荐
相关产品推荐

