如何将CSV中的数据读取到嵌套的键值对中以供将来检索?



我有一个CSV文件(data.csv(,看起来像:

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

我希望能够在指定时间访问给定列的数据(例如:Data1Time: 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)

相反,我想返回:

20

如何更新我的代码来实现此目的?

您无需加载庞大的熊猫库即可读取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])

保持部分海报原始软件

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

使用 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

你会得到这样的特定元素(第二列中的第二个元素,零索引(

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

如果您有日期和/或时间轴,那么我们可以以不同的方式处理它。

没有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

最新更新