在Python数据处理工作中,我们经常会遇到字典列表形式的结构化数据,比如从接口获取的用户信息列表、数据库查询返回的结果集等。很多时候需要按照某个或某几个键对这些数据进行分组,再将分组后的数值内容转换为NumPy数组,方便后续做数值计算、统计分析或者机器学习模型输入。本文将详细介绍几种实现该需求的方法,覆盖不同复杂度的场景。

基础方法:遍历分组后转换
最直观的思路是先遍历字典列表,按照目标键的值进行分组,再将每个分组内的对应数值提取出来转换为NumPy数组。这种方法不需要依赖额外的高级库,仅使用Python内置功能和NumPy即可实现。
实现步骤
- 初始化一个字典用于存储分组结果,键为分组键的值,值为该分组下的所有字典
- 遍历原始字典列表,将每个字典按照目标键归类到分组字典中
- 遍历分组字典,提取每个分组中需要的数值字段,转换为NumPy数组
代码示例
import numpy as np
# 原始字典列表数据
data_list = [
{"category": "A", "value": 10, "score": 85},
{"category": "B", "value": 20, "score": 90},
{"category": "A", "value": 15, "score": 88},
{"category": "B", "value": 25, "score": 92},
{"category": "A", "value": 12, "score": 86}
]
# 第一步:按category键分组
group_dict = {}
target_key = "category"
for item in data_list:
group_val = item[target_key]
if group_val not in group_dict:
group_dict[group_val] = []
group_dict[group_val].append(item)
# 第二步:提取每个分组的value字段转换为NumPy数组
result = {}
for group_name, group_items in group_dict.items():
# 提取每个字典的value值
values = [item["value"] for item in group_items]
# 转换为NumPy数组
result[group_name] = np.array(values)
print("分组数组结果:", result)
# 输出:分组数组结果: {'A': array([10, 15, 12]), 'B': array([20, 25])}
进阶方法:使用Pandas简化流程
如果已经引入了Pandas库,可以利用Pandas的分组功能大幅简化代码逻辑,尤其适合处理字段较多、分组规则复杂的场景。Pandas的groupby方法可以直接完成分组操作,再结合NumPy的转换方法即可快速得到结果。
代码示例
import pandas as pd
import numpy as np
# 同样的原始数据
data_list = [
{"category": "A", "value": 10, "score": 85},
{"category": "B", "value": 20, "score": 90},
{"category": "A", "value": 15, "score": 88},
{"category": "B", "value": 25, "score": 92},
{"category": "A", "value": 12, "score": 86}
]
# 转换为DataFrame
df = pd.DataFrame(data_list)
# 按category分组,提取value列转换为NumPy数组
result = {}
for name, group in df.groupby("category"):
result[name] = group["value"].to_numpy()
print("分组数组结果:", result)
# 输出:分组数组结果: {'A': array([10, 15, 12]), 'B': array([20, 25])}
多键分组场景
如果需要按照多个键进行分组,只需要调整分组的逻辑即可。基础方法中可以将多个键的值拼接作为分组字典的键,Pandas方法中可以在groupby中传入多个列名。
多键分组代码示例
import pandas as pd
import numpy as np
data_list = [
{"category": "A", "sub": "x", "value": 10},
{"category": "A", "sub": "y", "value": 15},
{"category": "B", "sub": "x", "value": 20},
{"category": "B", "sub": "y", "value": 25},
{"category": "A", "sub": "x", "value": 12}
]
df = pd.DataFrame(data_list)
# 按category和sub两个键分组
result = {}
for (cat, sub), group in df.groupby(["category", "sub"]):
result[(cat, sub)] = group["value"].to_numpy()
print("多键分组结果:", result)
# 输出:多键分组结果: {('A', 'x'): array([10, 12]), ('A', 'y'): array([15]), ('B', 'x'): array([20]), ('B', 'y'): array([25])}
注意事项
- 分组前需要确认目标键在所有字典中都存在,避免出现
KeyError,可以在遍历时添加键存在性判断 - 如果分组后的数值字段包含非数值类型,转换为NumPy数组时会报错,需要提前做数据类型校验和清洗
- 当数据量非常大时,基础遍历方法的性能会优于Pandas方案,可以根据实际数据规模选择合适的方法
- 如果需要保留分组后的原始字典结构,可以先分组再按需提取字段,不需要提前转换所有字段