使用Pandas聚合表格:动态计算状态统计及列均值指标
Pandas动态聚合计算实现方案
我来帮你搞定这个需求,下面是完整的Pandas代码实现,不仅能完成指定的统计计算,还能动态适配不同的列数和行数:
输入数据
首先是你提供的扁平化输入数据:
X Y Z AP 1 1 1 Karnataka 0 1 0 Goa 1 1 0 Tamilnadu 0 1 0 AP 0 1 1 Goa 0 0 0 Tamilnadu 0 1 1 Goa 0 0 0 AP 1 0 0 Tamilnadu 0 1 0 Tamilnadu 1 1 0 Goa 0 1 1 Karnataka 0 0 0 Karnataka 0 1 0
需执行的计算
- 统计状态列中存在的所有状态数量
- 计算每个状态下,X/Y/Z列中值为1的数量占该状态总样本数的比例
- 代码需支持动态列数(比如新增其他特征列)和行数(新增更多样本)
预期输出
Total AP Karnataka Goa Tamilnadu Total Sample 14 3 3 4 4 X 0.2857 0.6667 0.0000 0.2500 0.2500 Y 0.7143 0.6667 0.6667 0.5000 1.0000 Z 0.2857 0.6667 0.0000 0.2500 0.2500
实现代码
import pandas as pd # 1. 处理扁平化输入数据,转换为结构化DataFrame input_str = "X Y Z AP 1 1 1 Karnataka 0 1 0 Goa 1 1 0 Tamilnadu 0 1 0 AP 0 1 1 Goa 0 0 0 Tamilnadu 0 1 1 Goa 0 0 0 AP 1 0 0 Tamilnadu 0 1 0 Tamilnadu 1 1 0 Goa 0 1 1 Karnataka 0 0 0 Karnataka 0 1 0" data_list = input_str.split() # 动态识别特征列名(区分特征列和全大写的状态名) feature_cols = [] for item in data_list: if not item.isupper(): feature_cols.append(item) else: break num_features = len(feature_cols) # 拆分出所有样本:每个样本是[状态, 特征1, 特征2, ..., 特征N] samples = [] for i in range(num_features, len(data_list), num_features + 1): state = data_list[i] features = list(map(int, data_list[i+1:i+1+num_features])) samples.append([state] + features) # 构建结构化DataFrame df = pd.DataFrame(samples, columns=['State'] + feature_cols) # 2. 计算整体统计数据 total_sample_count = len(df) total_feature_ratios = df[feature_cols].mean().round(4) total_stats = pd.Series([total_sample_count] + total_feature_ratios.tolist(), index=['Total Sample'] + feature_cols) # 3. 按状态分组计算各特征的1占比 grouped_stats = df.groupby('State')[feature_cols].mean().round(4) # 4. 整理成预期的输出格式 # 转置分组结果,方便添加Total列 result = grouped_stats.T # 添加Total列:对应整体的特征占比 result['Total'] = total_feature_ratios.tolist() # 插入Total Sample行:对应各状态的样本数和总样本数 total_sample_row = pd.Series([total_sample_count] + grouped_stats.count().tolist(), index=['Total'] + grouped_stats.index.tolist()) result.loc['Total Sample'] = total_sample_row # 调整列顺序,把Total放在最前面 result = result[['Total'] + grouped_stats.index.tolist()] # 打印最终结果 print(result.to_string())
代码说明
- 动态适配:自动识别特征列(不管后续新增多少特征列或状态都能兼容)
- 数据解析:自动拆分扁平化的输入数据,转换成结构化的DataFrame
- 高效计算:利用
groupby和mean()直接计算1的占比(0/1值的均值就是1的比例),简洁高效 - 格式对齐:将结果调整为预期的行列结构,包含整体统计和各状态细分统计
内容的提问来源于stack exchange,提问作者sesu
相关产品推荐
相关产品推荐

