You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:41:43