如何用Pandas生成百分比变化矩阵并获取最值变化产品?
Pandas实现产品成本百分比变化矩阵及极值组合获取
1. 生成百分比变化矩阵
首先将DataFrame的product列设为索引,便于后续计算操作:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'product': ['product a', 'product b', 'product c'], 'cost': [56, 59, 104] }).set_index('product')
核心计算逻辑是:对行产品X和列产品Y,百分比变化公式为(Y成本 - X成本)/X成本 * 100,完成计算后格式化数值为带两位小数的百分比格式,同时将对角线(自身对比)设为空字符串:
# 提取成本数组 costs = df['cost'].values # 计算两两产品间的百分比变化矩阵 pct_change_matrix = (costs[:, None] - costs) / costs * 100 # 转换为DataFrame并设置行列索引 pct_change_df = pd.DataFrame( pct_change_matrix, index=df.index, columns=df.index ) # 格式化数值为百分比格式,对角线置空 pct_change_df = pct_change_df.applymap(lambda x: f'{x:.2f}%' if x != 0 else '')
运行后pct_change_df即为目标格式的百分比变化矩阵。
2. 获取百分比变化最高/最低的产品组合
先将矩阵转为长格式,排除自身对比的无效行,并将百分比字符串转为数值类型用于排序:
# 转换为长格式 long_df = pct_change_df.stack().reset_index() long_df.columns = ['基准产品', '对比产品', '百分比变化'] # 过滤自身对比行,转换百分比为数值 long_df = long_df[long_df['基准产品'] != long_df['对比产品']] long_df['数值'] = long_df['百分比变化'].str.rstrip('%').astype(float)
接着筛选极值对应的产品组合:
# 获取百分比变化最高的组合 max_row = long_df.loc[long_df['数值'].idxmax()] max_combination = f"{max_row['基准产品']} 与 {max_row['对比产品']}" max_pct = max_row['百分比变化'] # 获取百分比变化最低的组合 min_row = long_df.loc[long_df['数值'].idxmin()] min_combination = f"{min_row['基准产品']} 与 {min_row['对比产品']}" min_pct = min_row['百分比变化']
示例中最高组合为product a 与 product c(85.71%),最低组合为product c 与 product a(-46.15%),与预期结果一致。
内容的提问来源于stack exchange,提问作者Hal
相关产品推荐
相关产品推荐

