脚本如何数据分组统计

wen 实用脚本 29

本文目录导读:

脚本如何数据分组统计

  1. Python(最常用)
  2. JavaScript
  3. Shell 脚本
  4. SQL 风格(适用于数据库)
  5. 可选的分组统计函数模板

我来介绍几种常见的数据分组统计方法,针对不同的脚本语言和场景:

Python(最常用)

使用原始 Python

# 示例数据
data = [
    {"category": "A", "value": 10},
    {"category": "B", "value": 20},
    {"category": "A", "value": 15},
    {"category": "C", "value": 30},
]
# 分组统计
from collections import defaultdict
grouped = defaultdict(list)
for item in data:
    grouped[item["category"]].append(item["value"])
# 统计总和
result = {k: sum(v) for k, v in grouped.items()}
print(result)  # {'A': 25, 'B': 20, 'C': 30}
# 统计平均值
result_avg = {k: sum(v)/len(v) for k, v in grouped.items()}

使用 Pandas

import pandas as pd
df = pd.DataFrame(data)
# 单列分组
result = df.groupby('category')['value'].sum()
# 多列分组
result = df.groupby(['category', 'sub_category']).agg({
    'value': ['sum', 'mean', 'count']
})
# 常用聚合函数
# sum(), mean(), count(), max(), min(), std(), first(), last()

JavaScript

在 Node.js 中

// 示例数据
const data = [
  { category: 'A', value: 10 },
  { category: 'B', value: 20 },
  { category: 'A', value: 15 },
  { category: 'C', value: 30 },
];
// 分组统计
function groupBy(arr, key, statistic) {
  const grouped = arr.reduce((acc, item) => {
    const groupKey = item[key];
    if (!acc[groupKey]) {
      acc[groupKey] = [];
    }
    acc[groupKey].push(item.value);
    return acc;
  }, {});
  // 统计总和
  if (statistic === 'sum') {
    for (let key in grouped) {
      grouped[key] = grouped[key].reduce((sum, val) => sum + val, 0);
    }
  }
  return grouped;
}
console.log(groupBy(data, 'category', 'sum'));
// { A: 25, B: 20, C: 30 }

Shell 脚本

使用 awk

# 示例数据 (data.txt)
# A 10
# B 20
# A 15
# C 30
# 分组求和
awk '{sum[$1] += $2} END {for (k in sum) print k, sum[k]}' data.txt
# 输出: A 25
#       B 20
#       C 30
# 分组计数
awk '{count[$1]++} END {for (k in count) print k, count[k]}' data.txt

使用 sort + uniq

# 分组计数
cat data.txt | cut -d' ' -f1 | sort | uniq -c
# 输出: 2 A
#       1 B
#       1 C
# 分组求和
cat data.txt | awk '{sum[$1]+=$2; count[$1]++} END {for(k in sum) print k, sum[k], sum[k]/count[k]}'

SQL 风格(适用于数据库)

-- 基本分组统计
SELECT category, SUM(value) as total, AVG(value) as avg, COUNT(*) as count
FROM table_name
GROUP BY category;
-- 多列分组
SELECT category, sub_category, SUM(value) as total
FROM table_name
GROUP BY category, sub_category;

可选的分组统计函数模板

Python 通用函数

def group_statistics(data, group_keys, agg_func):
    """
    通用分组统计函数
    Args:
        data: 数据列表
        group_keys: 分组键名
        agg_func: 聚合函数字典 {'field': ['sum', 'mean', 'count']}
    """
    result = {}
    for item in data:
        # 构建分组键
        if isinstance(group_keys, list):
            key = tuple(item[k] for k in group_keys)
        else:
            key = item[group_keys]
        if key not in result:
            result[key] = {'items': []}
        result[key]['items'].append(item)
    # 应用聚合函数
    final_result = {}
    for key, value in result.items():
        final_result[key] = {}
        for field, funcs in agg_func.items():
            values = [item[field] for item in value['items']]
            for func in funcs:
                if func == 'sum':
                    final_result[key][f'{field}_{func}'] = sum(values)
                elif func == 'mean':
                    final_result[key][f'{field}_{func}'] = sum(values)/len(values)
                elif func == 'count':
                    final_result[key][f'{field}_{func}'] = len(values)
    return final_result
# 使用示例
result = group_statistics(data, 'category', {'value': ['sum', 'mean', 'count']})

选择哪种方法取决于:

  • 数据量大小(小数据用 Python/JS,大数据用 SQL/Pandas)
  • 数据类型(结构化数据用 SQL,文本数据用 awk)
  • 运行环境(本地脚本用 Python,Web 用 JS,服务器用 Shell)

需要针对特定场景的示例吗?

抱歉,评论功能暂时关闭!