如何将具有不同键的字典列表保存为同一行中的 csv?
How to save list of dictionaries with different keys as csv in the same row?
我有这个庞大的字典列表,每个列表中除了名称外都包含不同的键。每个 collection 中都存在键名,但其他键不同。例如:
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,以便每个唯一键都有 headers 列。在这种情况下,我会有以下列:
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
我想要的是像下面这样附加 column-wise 项目:
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
分组,然后为每列获取第一个非空值。
要保存为 csv,您应该这样做:
df.to_csv('file_name.csv')
我有这个庞大的字典列表,每个列表中除了名称外都包含不同的键。每个 collection 中都存在键名,但其他键不同。例如:
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,以便每个唯一键都有 headers 列。在这种情况下,我会有以下列:
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
我想要的是像下面这样附加 column-wise 项目:
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
分组,然后为每列获取第一个非空值。
要保存为 csv,您应该这样做:
df.to_csv('file_name.csv')