我有一个庞大的字典列表,每个列表中除了名称之外都有不同的键。每个集合中都存在密钥名称,但其他密钥不同。例如:
items = [{
'name': 'A',
'P1 v P2': 0.2
}, {
'name': 'B',
'P1 v P2': 0.3
}, {
'name': 'C',
'P1 v P2': 0.3
}, {
'name': 'D',
'P1 v P2': 0.3
}, {
'name': 'E',
'P1 v P2': 0.3
}, {
'name': 'A',
'P2 v P3': 0.04
}, {
'name': 'B',
'P2 v P3': 0.9
}, {
'name': 'C',
'P2 v P3': 0.2
}, {
'name': 'D',
'P2 v P3': 0.3
}, {
'name': 'E',
'P2 v P3': 0.5
}, {
'name': 'A',
'P1 v P4': 0.3
}, {
'name': 'B',
'P1 v P4': 0.3
}, {
'name': 'C',
'P1 v P4': 0.3
}, {
'name': 'D',
'P1 v P4': 0.3
}, {
'name': 'E',
'P1 v P4': 0.3
}]
现在,我需要将其转换为CSV,以便每个唯一键都有列标题。在这种情况下,我会有以下列:
name, P1 v P2, P1 v P4, P2 v P3
因此,我做了以下操作:
from collections import ChainMap
items_dict = dict(ChainMap(*items))
headers = items_dict.keys()
with open(filename, 'w', encoding='utf8', newline='') as score_table:
csv_writer = csv.DictWriter(score_table, headers)
csv_writer.writeheader()
csv_writer.writerows(items)
但这并没有给我想要的结果。我得到这样的东西:
name, P1 v P2, P1 v P4, P2 v P3
A, 0.2
B, 0.3
C, 0.3
D, 0.3
E, 0.3
A, ,0.3
B, ,0.3
C, ,0.3
D, ,0.3
E, ,0.3
A, , ,0.9
B, , ,0.2
C, , ,0.3
D, , ,0.5
E, , ,0.9
我想要的是按列添加项目,如下所示:
name, P1 v P2, P1 v P4, P2 v P3
A, 0.2,0.3,0.9
B, 0.3,0.3,0.2
C, 0.3,0.3,0.3
D, 0.3,0.3,0.5
E, 0.3,0.3,0.9
但我不知道该怎么做。我一直在尝试几种不同的方法,但都没有达到预期的效果。我甚至尝试将其转换为pandas数据帧,看看它是否有效,但也没有成功。
这应该可以解决您的问题:
df = pd.DataFrame(items).groupby("name").first()
它通过name
进行分组,然后获得每列的第一个非null值。
要保存到csv,您应该执行以下操作:
df.to_csv('file_name.csv')