Tengo datos de un archivo .csv que es el siguiente (el archivo real contiene muchos más datos). La primera fila que estoy mostrando contiene las etiquetas para cada columna, y el resto de las líneas contienen datos de temperatura para cada ubicación. También hay un encabezado antes de estos datos que no incluí para que la fila superior del archivo .csv no contenga las etiquetas.

Scan,location1,location2,location3
1,32.621,38.57,36.977
2,30.976,38.451,36.971
3,32.599,38.536,36.991

Lo que quiero hacer es crear un diccionario de listas donde las claves son las etiquetas (fila superior) y el valor es una lista de todas las temperaturas para cada etiqueta. Entonces la salida que estoy buscando es esta ...

{"scan":[1,2,3], "location1":[32.621,30.976,32.599], "location2":[38.57,38.451,38.536], "location3":[36.977,36.971,36.991]}

He creado con éxito una lista de las claves y un diccionario que contiene listas vacías como valores. Tengo un problema en mi declaración 'else' donde todos los datos de temperatura en cada línea van a cada clave del diccionario. ¿Cómo puedo agregar cada elemento de la lista line_data a una clave diferente en mi diccionario de datos?

import csv
from tkinter.filedialog import askopenfilename

csv_file_name = askopenfilename(title='Select the temperature file you want to analyze')
file = open(csv_file_name, 'r')
read_file = file.readlines()
keys = []
for line in read_file:
    # Column titles will be dictionary keys
    if keys == []:
        keys = line.split(",")
        data = dict.fromkeys(keys, [])
    else:
        line_data = line.split(",")
        for i in range(len(line_data)):
            data[keys[i]].append(line_data[i])
0
JohnnyW 30 sep. 2019 a las 07:42

3 respuestas

La mejor respuesta

Siguiendo su enfoque, está pasando la función [] a dict.fromkeys , lo que significa que todos los valores en el diccionario apuntarán al mismo objeto de lista.

Encuentra el siguiente código para corregirlo:

import csv
from tkinter.filedialog import askopenfilename

csv_file_name = askopenfilename(title='Select the temperature file you want to analyze')
file = open(csv_file_name, 'r')
read_file = file.readlines()
keys = []
for line in read_file:
    # Column titles will be dictionary keys
    if keys == []:
        keys = line.split(",")
        data={keys[k]:[] for k in range(len(keys))} # **you can initialise a dict like this**
        # data = dict.fromkeys(keys, []) # -- Don't do this!!
    else:
        line_data = line.split(",")
        for i in range(len(line_data)):
            data[keys[i]].append(line_data[i])
print(data)

¡Espero que esto ayude!

1
Bharat Gera 30 sep. 2019 a las 05:09

Utilice pandas para leer el archivo CSV y luego se puede procesar mediante el procesamiento del diccionario.

import pandas as pd

df = pd.read_csv('sales.csv')

res_dict = {col:list(df[col].values) for col in df.columns}

print(res_dict)

Salida:

{'Scan': [1, 2, 3], 'location1': [32.621, 30.976, 32.599000000000004], 'location2': [38.57, 38.451, 38.536], 'location3': [36.977, 36.971, 36.991]}
2
Akash Pagar 30 sep. 2019 a las 04:54

¿Es esto lo que estás buscando?

df
Out[9]: 
   Scan  location1  location2  location3
0     1     32.621     38.570     36.977
1     2     30.976     38.451     36.971

df.to_dict('list')
Out[12]: 
{'Scan': [1, 2],
 'location1': [32.621, 30.976],
 'location2': [38.57, 38.451],
 'location3': [36.977, 36.971]}
0
Humi 30 sep. 2019 a las 04:59
58161592