2016-11-07 14 views
-2

私は以下のCSVファイルを持っています。私はCSVをPythonを使って辞書の辞書に変換する必要があります。csvをPythonの辞書の辞書に変換するには?

userId movieId rating 
1   16 4 
1   24 1.5 
2   32 4 
2   47 4 
2   50 4 
3  110 4 
3  150 3 
3  161 4 
3  165 3 

出力は私がこれを行う方法を教えてください

dataset={'1':{'16':4,'24':1.5}, 
     '2':{'32':4,'47':4,'50':4}, 
     '3':{'110':4,'150':3,'161':4,'165':3}} 

の下に表示のようにする必要があります。事前に感謝します

+6

の内容これまでのところ、これを解決するに任意の試み?その場合は、質問を編集して共有してください。そうでない場合は、質問をする前に何かを試してください。 –

+1

Jimが正しいので、Downvoted。 –

答えて

2

あなたは、ネストされた辞書を探しています。 perlの自動化機能をPythonで実装します(詳細はhere)。ここにMWEがあります。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import csv 

class AutoVivification(dict): 
    """Implementation of perl's autovivification feature.""" 
    def __getitem__(self, item): 
     try: 
      return dict.__getitem__(self, item) 
     except KeyError: 
      value = self[item] = type(self)() 
      return value 

def main(): 
    d = AutoVivification() 
    filename = 'test.csv' 
    with open(filename, 'r') as f: 
     reader = csv.reader(f, delimiter=',') 
     next(reader)  # skip the header 
     for row in reader: 
      d[row[0]][row[1]] = row[2] 

    print(d) 
    #{'1': {'24': '1.5', '16': '4'}, '3': {'150': '3', '110': '4', '165': '3', '161': '4'}, '2': {'32': '4', '50': '4', '47': '4'}} 

if __name__ == '__main__': 
    main() 

test.csv

userId,movieId,rating 
1,16,4 
1,24,1.5 
2,32,4 
2,47,4 
2,50,4 
3,110,4 
3,150,3 
3,161,4 
3,165,3 
+0

海、上記のコードでは、 "d"は先に進むために保存していません。 –

0
import numpy as np 

col1,col2,col3 = np.loadtxt('test2.csv',delimiter=',',skiprows=1,unpack=True,dtype=int) 

dataset = {} 

for a,b,c in zip(col1,col2,col3): 
    if str(a) in dataset: 
     dataset[str(a)][str(b)]=str(c) 
    else: 
     dataset[str(a)]={str(b):str(c)} 
print(dataset) 

これは行う必要があります。上記の例のファイルは、tsv(タブで区切られた値)のように見えます。その場合は、私の例で区切りフラグを削除してください。

+0

ありがとうございます、それは動作していますが、小数点が得られません。 –

0
import csv 
dataset = dict() 
with open("file_name", "rb") as csv_file: 
    data = csv.DictReader(csv_file) 
    for row in data: 
     old_data = dataset.get(row["userId"], None) 

     if old_data is None: 
      dataset["userId"] = {row["movieId"]: row["rating"] } 
     else: 
      old_data[row["movieId"]] = row["rating"] 
      dataset[row["userId"]] = old_data 
関連する問題