0
我在实体 - 属性 - 值格式的东西有一个CSV文件(即,我event_id
是非唯一的和重复ķ倍在ķ相关的属性):平展实体 - 属性 - 值(EAV)模式
event_id, attribute_id, value
1, 1, a
1, 2, b
1, 3, c
2, 1, a
2, 2, b
2, 3, c
2, 4, d
是否有任何方便的技巧变换可变数量的属性(即,行)转换成列?这里的关键是输出应该是结构化数据表格m = max(k);在缺少的属性填充NULL
将是最佳的:
event_id, 1, 2, 3, 4
1, a, b, c, null
2, a, b, c, d
我的计划是:(1)CSV转换成JSON对象,看起来像这样:
data = [{'value': 'a', 'id': '1', 'event_id': '1', 'attribute_id': '1'},
{'value': 'b', 'id': '2', 'event_id': '1', 'attribute_id': '2'},
{'value': 'a', 'id': '3', 'event_id': '2', 'attribute_id': '1'},
{'value': 'b', 'id': '4', 'event_id': '2', 'attribute_id': '2'},
{'value': 'c', 'id': '5', 'event_id': '2', 'attribute_id': '3'},
{'value': 'd', 'id': '6', 'event_id': '2', 'attribute_id': '4'}]
(2)提取独特的事件ID :
events = set()
for item in data:
events.add(item['event_id'])
(3)创建列表的列表,其中每个内部列表是相应父级事件的属性列表。
attributes = [[k['value'] for k in j] for i, j in groupby(data, key=lambda x: x['event_id'])]
(4)创建带来的事件和属性组合在一起的字典:
event_dict = dict(zip(events, attributes))
,看起来像这样:
{'1': ['a', 'b'], '2': ['a', 'b', 'c', 'd']}
我不知道如何让所有内部列表根据需要填入NULL
值。这似乎是需要在步骤(3)中完成的事情。另外,创建n列表中的整个mNULL
值已经超出了我的想法,然后遍历每个列表并使用attribute_id
作为列表位置填充值;但那看起来很笨拙。