How to convert csv to dictionary of dictionaries in python?

2024/7/8 8:13:47

I have a CSV file shown below.I need to convert CSV to dictionary of dictionaries using 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

The output should be like shown below

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

Please let me know how to do this. Thanks in advance

Answer

You are looking for nested dictionaries. Implement the perl's autovivification feature in Python (the detailed description is given here). Here is a MWE.

#!/usr/bin/env python
# -*- coding: utf-8 -*-import csvclass 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 valuedef main():d = AutoVivification()filename = 'test.csv'with open(filename, 'r') as f:reader = csv.reader(f, delimiter=',')next(reader)        # skip the headerfor 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()

The content of 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
https://en.xdnf.cn/q/120132.html

Related Q&A

Mo Money- Making an algorithm to solve two variable algebra problems

A cash drawer contains 160 bills, all 10s and 50s. The total value ofthe 10s and 50s is $1,760.How many of each type of bill are in the drawer? You can figure thisout by trial and error (or by doing a…

How to explode Python Pandas Dataframe and merge strings from other dataframe?

Dataframe1 has a lot of rows and columns of data. One column is Text. Certain rows in Text column have strings and some strings include within the strings this {ExplodeEList2} How to explode (expand) t…

Creating a new column with numbers in Pandas to group with a column with existing numbers

Good day, I have a column from a data frame here:A231011 22My objective is to create a new column and associate the numbers like this:A file_number 23 8 10 6 11 6 22 8As…

How to get PDF file from the binary data of SoftLayers quote?

I got the binary data by "getPdf" method of SoftLayers API.Ref. BillingSoftLayer_Billing_Order_Quote::getPdf | SoftLayer Development Network - http://sldn.softlayer.com/reference/services/Sof…

How to list of elements and use those elements as a header of pandas dataframe?

I have a list with some elements. For example: list= [name, phone_number,age,gender] I want to use these elements as a header or column name in a pandas dataframe. I would really appreciate your ideas.…

Averaging Filter using python

I am new in python and trying apply averaging filter on image as the way i understand averaging concept summing up the neighboring elements including itself and divide it by number of elementstechnique…

Click on Show more deals in webpage with Selenium

Id like to click on every Show 10 more deals on the following page: "https://www.uswitch.com/broadband/compare/deals_and_offers/" but it does not seem to work. Im stuck having the following e…

In Matplotlib, what axis attribute specifies the spacing between ticks? [duplicate]

This question already has answers here:Changing the tick frequency on the x or y axis(15 answers)Closed 6 years ago.When generating a Matplotlib line or scatter plot, what axis attribute specifies the …

How can I make a simple calculator in python 3?

Im making this calculator using python 3, and this is what I have so far:print("Welcome to Calculator!")class Calculator:def addition(self,x,y):added = x + yreturn addeddef subtraction(self,x…

python 3: lists dont change their values

So I am trying to change a bunch of list items by a random percentage using a for loop.import random as rdm list = [1000, 100, 50, 25] def change():for item in list:item = item + item*rdm.uniform(-10, …