按id列分组将DataFrame转为嵌套字典列表适配sklearn_crfsuite.CRF
按ID分组将DataFrame转换为嵌套字典列表(适配sklearn_crfsuite.CRF格式)
原始DataFrame示例
假设你的DataFrame结构如下:
import pandas as pd df = pd.DataFrame({ 'id': [0, 0, 1, 1], 'feature1': ['a', 'b', 'c', 'd'], 'feature2': [1, 2, 3, 4], 'label': ['X', 'Y', 'X', 'Y'] })
错误尝试与结果
直接使用df.to_dict('records')会得到未分组的扁平字典列表,不符合需求:
# 错误代码 flat_records = df.to_dict('records')
输出结果:
[ {'id': 0, 'feature1': 'a', 'feature2': 1, 'label': 'X'}, {'id': 0, 'feature1': 'b', 'feature2': 2, 'label': 'Y'}, {'id': 1, 'feature1': 'c', 'feature2': 3, 'label': 'X'}, {'id': 1, 'feature1': 'd', 'feature2': 4, 'label': 'Y'} ]
正确实现代码
通过groupby按id分组,再将每个组转换为字典列表,最后组合成嵌套结构:
# 按id分组,移除id列后转为字典列表,再收集所有组的结果 grouped_feats = [group.drop('id', axis=1).to_dict('records') for _, group in df.groupby('id')]
期望输出结果
执行上述代码后,得到符合sklearn_crfsuite.CRF参数要求的嵌套结构:
[ [ {'feature1': 'a', 'feature2': 1, 'label': 'X'}, {'feature1': 'b', 'feature2': 2, 'label': 'Y'} ], [ {'feature1': 'c', 'feature2': 3, 'label': 'X'}, {'feature1': 'd', 'feature2': 4, 'label': 'Y'} ] ]
说明
groupby('id')将DataFrame按id值分组,相同id的行归为一组drop('id', axis=1)移除无用的id列(CRF模型不需要该字段作为特征)to_dict('records')将每组的行转换为字典列表- 列表推导式将所有组的字典列表收集为最终的嵌套大列表,完美适配sklearn_crfsuite.CRF的feat参数格式
内容的提问来源于stack exchange,提问作者Chang
相关产品推荐
相关产品推荐

