Приведение типов данных при преобразовании файла CSV в словарь в Python - PullRequest
1 голос
/ 13 апреля 2020

У меня есть CSV-файл, который выглядит следующим образом

Item,Price,Calories,Category
Orange,1.99,60,Fruit
Cereal,3.99,110,Box Food
Ice Cream,6.95,200,Dessert
...

, и я хочу сформировать Python словарь в следующем формате:

{'Orange': (1.99, 60, 'Fruit'), 'Cereal': (3.99, 110, 'Box Food'), ... }

Я хочу убедиться, что заголовки столбцов удалены (т.е. первая строка НЕ ​​включена).

Вот что я пробовал до сих пор:

reader = csv.reader(open('storedata.csv'))

for row in reader:
    # only needed if empty lines in input
    if not row:
        continue
    key = row[0]
    x = float(row[1])
    y = int(row[2])
    z = row[3]
    result[key] = x, y, z

print(result)

Однако, когда я делаю это, я получаю ValueError: could not convert string to float: 'Price', и я не знаю, как это исправить. Я хочу сохранить эти три значения в кортеже.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 13 апреля 2020

Я рекомендую использовать pandas.read_csv для чтения вашего csv файла:

import pandas as pd

df = pd.DataFrame([["Orange",1.99,60,"Fruit"], ["Cereal",3.99,110,"Box Food"], ["Ice Cream",6.95,200,"Dessert"]],
            columns= ["Item","Price","Calories","Category"])

Я попытался кадрировать ваши данные, как показано ниже:

print(df)
    Item         Price    Calories    Category
0   Orange       1.99       60          Fruit
1   Cereal       3.99       110         Box Food
2   Ice Cream    6.95       200         Dessert

Сначала отключив, вы создаете пустой Python dictionary для хранения файлов, а затем используете pandas.DataFrame.iterrows() для итерации по столбцам

res = {}


for index, row in df.iterrows():
    item = row["Item"]
    x = pd.to_numeric(row["Price"], errors="coerce")
    y = int(row["Calories"])
    z = row["Category"]
    res[item] = (x,y,z) 

Фактически печать res приводит к expected output, как показано ниже:

print(res)

{'Orange': (1.99, 60, 'Fruit'),
 'Cereal': (3.99, 110, 'Box Food'),
 'Ice Cream': (6.95, 200, 'Dessert')}
0 голосов
/ 13 апреля 2020

Вы можете просто использовать dict плюс zip, если используете pandas.DataFrame с именем df:

>>> dict(zip(df['Item'], df[['Price', 'Calories', 'Category']].values.tolist()))
{'Orange': [1.99, 60, 'Fruit'], 'Cereal': [3.99, 110, 'Box Food'], 'Ice Cream': [6.95, 200, 'Dessert']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...