Как прочитать данные из CSV во вложенные пары ключ-значение для последующего поиска? - PullRequest
3 голосов
/ 01 февраля 2020

У меня есть файл CSV (data.csv), который выглядит следующим образом:

Time,Data1,Data2,Data3
0,10,25,100
1,20,30,120
2,25,35,125
3,30,50,150

Я хочу иметь возможность доступа к данным для данного столбца в указанное время (например: входные данные Data1 и Time: 1 должны вернуть 20).

Я пытался:

import csv

dataFile = 'data.csv'

with open(dataFile) as inputData:
    csv_input = csv.reader(inputData)
    headers = next(csv_input)
    data = list(zip(*[map(int, row) for row in csv_input]))

my_list = list(zip(data[0], data[1:]))
my_dictionary = dict(zip(headers, my_list))

print(my_dictionary['Data1'][1])

Однако это возвращает:

(25, 30, 35, 50)

Я бы вместо этого хотел return:

20

Как я могу обновить свой код для достижения этой цели?

Ответы [ 4 ]

2 голосов
/ 01 февраля 2020

Вам не нужно загружать огромную библиотеку Panda для чтения файла CSV. Python предоставляет модули для этого:


import csv
import collections

filename = "data_80.csv"


def read_csv(filename):
    columns = collections.defaultdict(list)
    with open(filename, 'rt') as file:
        rows = csv.DictReader(file)
        for row in rows:
            for key, val in row.items():
                columns[key].append(val)
    return dict(columns)  

data = read_csv(filename)

print(data) # data is a dictionary of list
{
'Time': ['0', '1', '2', '3'], 
'Data1': ['10', '20', '25', '30'], 
'Data2': ['25', '30', '35', '50'], 
'Data3': ['100', '120', '125', '150']
}

# You just can do 
print(data['Data1'][0])
1 голос
/ 01 февраля 2020

Сохранение части плакатов оригинального программного обеспечения

import csv

dataFile = 'data.csv'

with open(dataFile) as inputData:
    csv_input = csv.reader(inputData)
    headers = next(csv_input)
    data = list(zip(*[map(int, row) for row in csv_input]))

Модификация, диктитура это просто:

my_dictionary = dict(zip(headers, data))

print(my_dictionary ['Data1'][1])
>>> 20
0 голосов
/ 01 февраля 2020

Раствор без pandas:

import csv

dataFile = 'data.csv'

with open(dataFile) as inputData:
    csv_input = csv.reader(inputData)
    i = zip(next(csv_input), zip(*csv_input))
    data, (_, times) = {}, next(i)
    for k, line in i:
        for t, l in zip(times, line):
            data.setdefault(k, {}).setdefault(t, {})
            data[k][int(t)] = l

print(data['Data1'][1])

Отпечатки:

20
0 голосов
/ 01 февраля 2020

Использование Pandas.

Таким образом,

import pandas as pd

Я создал файл из предоставленных вами данных и импортировал,

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

print(df.head())

Похоже,

Time  Data1  Data2  Data3
0     0     10     25    100
1     1     20     30    120
2     2     25     35    125
3     3     30     50    150

Вы получите указанный c элемент, подобный этому (второй элемент во втором столбце, с нулевым индексированием)

print(df.iloc[1][1])

20

Если у вас есть дата и / или время ось, тогда мы могли бы подойти к ней по-другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...