基于有效值统计DataFrame指定值占比并生成聚合交叉表
实现方案(Python + Pandas)
以下是可直接运行的完整实现代码:
import pandas as pd import numpy as np # -------------------------- # 1. 构造原始测试数据(如果是从文件读取可替换为pd.read_csv等方法) # -------------------------- raw_data = { "id": list(range(1, 11)), "a1_l1": [1,1,2,5,5,5,5,2,3,3], "a2_l1": [5]*10, "a3_l1": [3,3,3,3,2,2,2,2,1,1], "a1_l2": [1,1,5,5] + [np.nan]*6, "a2_l2": [2,2,5,5] + [np.nan]*6, "a3_l2": [3,3,3,3] + [np.nan]*6 } df = pd.DataFrame(raw_data) # -------------------------- # 2. 核心计算逻辑 # -------------------------- # 移除不需要的id列 df_calc = df.drop(columns=["id"]) # 宽表转长表,自动过滤空值记录 df_long = df_calc.melt(var_name="col_name", value_name="value").dropna(subset=["value"]) # 拆分列名得到a维度和l维度 df_long[["a_dim", "l_dim"]] = df_long["col_name"].str.split("_", expand=True) # 分组计算5的占比,再转成交叉表结构 result = df_long.groupby(["a_dim", "l_dim"]).apply( lambda group: (group["value"] == 5).sum() / group["value"].count() ).unstack() # 清理索引名匹配要求的输出格式 result.index.name = None result.columns.name = None
运行后输出result即可得到目标汇总表:
l1 l2 a1 0.4 0.5 a2 1.0 0.5 a3 0.0 0.0
内容的提问来源于stack exchange,提问作者EGM8686
相关产品推荐
相关产品推荐

