簡體   English   中英

Python將CSV轉換為列表字典

[英]Python Convert CSV to Dictionary of Lists

我有一個CSV文件,看起來像這樣:

compound, x1data,y1data,x2data,y2data
a,1,2,3,4
a,9,10,11,12
b,5,6,7,8
b,4,5,6,7

我想創建一個列表字典,其中化合物是關鍵,對於每個化合物,我都會得到x1data,y1data,x2data和y2data的列表。

我相信它看起來像這樣:

my_dict = {
    'a': {'x1data':[1,9],'y1data':[2,10],'x2data':[3,11],'y2data':[4,12]},
    'b':{'x1data':[5,4],'y1data':[6,5],'x2data':[7,6],'y2data':[8,7]}
}

最終,我想為每個化合物繪制x1data與y1data以及x2data與y2data的關系圖。

我已經嘗試過這樣做,它可以正確地使字典中的鍵是復合鍵,但是它沒有給我值列表(僅是csv中的最后一個值)。

my_dict = {}
with open(filename, 'r') as infile:
    reader = csv.DictReader(infile)
    for row in reader:
        key = row.pop('compound')
        my_dict[key] = row

這是一種無需任何庫即可實現的方法。

f = open('f.csv', 'rb')
next(f)
mydict = {}
for row in f:

    compound,x1data,y1data,x2data,y2data = row.strip().split(',')
    x1data,y1data,x2data,y2data = int(x1data),int(y1data),int(x2data),int(y2data)
    if compound not in mydict:
        mydict[compound] = { 'x1data' : [], 'y1data' : [], 'x2data' : [], 'y2data' : [] }


    mydict[compound]['x1data'].append(x1data)
    mydict[compound]['y1data'].append(y1data)
    mydict[compound]['x2data'].append(x2data)
    mydict[compound]['y2data'].append(y2data)
}
f.close()

print mydict

給你:

{'a': {'x2data': [3, 11], 'y2data': [4, 12], 'y1data': [2, 10], 'x1data': [1, 9]}, 'b': {'x2data': [7, 6], 'y2data': [8, 7], 'y1data': [6, 5], 'x1data': [5, 4]}}

您可以使用標准庫中的collections.defaultdict

from collections import defaultdict as dd

import csv

my_dict = dd(lambda: dd(list))

with open("test.csv", 'r') as f:
    reader = csv.DictReader(f)

    for row in reader:
        for key in reader.fieldnames[1:]:
            my_dict[row.get("compound")][key].append(row[key])

從技術上講,您得到的並不是一門dict 但是,您可以以相同的方式使用它。

如果要打印,則需要更多的時間:

from pprint import pprint

# ...

pprint({k: dict(v) for k, v in dict(my_dict).items()})

這給出:

{'a': {'x1data': ['1', '9'],
       'x2data': ['3', '11'],
       'y1data': ['2', '10'],
       'y2data': ['4', '12']},
 'b': {'x1data': ['5', '4'],
       'x2data': ['7', '6'],
       'y1data': ['6', '5'],
       'y2data': ['8', '7']}}

這是一個不依賴於csv庫的解決方案,應該與任意大小的標頭一起使用。

with open("dat.csv", 'r') as f:
    lines = f.read().splitlines()

headers = lines.pop(0).split(",")[1:] # names of the columns
results = {}
for line in lines:
  line = line.split(",")
  if line[0] not in results:
    results[line[0]] = {header:[] for header in headers}
  for i, header in enumerate(headers):
    results[line[0]][header].append(line[i+1])
    # for ints: results[line[0]][header].append(int(line[i+1]))

print(results)

輸出:

{'a': {'x2data': ['3', '11'], 'y2data': ['4', '12'], 'y1data': ['2', '10'], 'x1data': ['1', '9']}, 'b': {'x2data': ['7', '6'], 'y2data': ['8', '7'], 'y1data': ['6', '5'], 'x1data': ['5', '4']}}

我所做的唯一更改是在提供的標頭中刪除了一個空格(無論哪種方式都可以工作)。

您可以使用itertools.groupby

import csv, itertools
[_, *hs], *data = csv.reader(open('filename.csv'))
r = [(a, [list(map(int, i[1:])) for i in b]) for a, b in itertools.groupby(data, key=lambda x:x[0])]
final_result = {a:dict(zip(hs, map(list, zip(*b)))) for a, b in r}

輸出:

{'a': {'x1data': [1, 9], 'y1data': [2, 10], 'x2data': [3, 11], 'y2data': [4, 12]}, 'b': {'x1data': [5, 4], 'y1data': [6, 5], 'x2data': [7, 6], 'y2data': [8, 7]}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM