本文目录导读:

我来介绍几种常见的数据分组统计方法,针对不同的脚本语言和场景:
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)
需要针对特定场景的示例吗?