【问题标题】:Python - How to Create Dictionary from CSV data file using column headingsPython - 如何使用列标题从 CSV 数据文件创建字典
【发布时间】:2018-09-26 19:49:41
【问题描述】:

我正在尝试创建一个函数,该函数接受 .csv 数据文件的名称和表示该文件中列标题的字符串列表,并返回一个 dict 对象,其中每个键是列标题,对应的值是 numpy数据文件该列中的值的数组。

我现在的代码:

def columndata(filename, columns):
d = dict()
for col in columns:
with open(filename) as filein:
    reader = csv.reader(filein)
        for row in reader:
           if col in row:
               d.append(row)
return d

示例 CSV 如下所示:

test1,test2
3,2
1,5
6,47
1,4

列文件如下所示:

cols = ['test1', 'test2']

最终结果应该是这样的字典:

{'test1':[3,1,6,1], 'test2':[2, 5, 4, 4]}

【问题讨论】:

    标签: python list dictionary tuples


    【解决方案1】:

    您可以使用 DictReader 将 CSV 数据解析为字典:

    import csv
    from collections import defaultdict
    
    
    def parse_csv_by_field(filename, fieldnames):
        d = defaultdict(list)
        with open(filename, newline='') as csvfile:
            reader = csv.DictReader(csvfile, fieldnames)
            next(reader)  # remove header
            for row in reader:
                for field in fieldnames:
                    d[field].append(float(row[field]))  # thanks to Paulo!
        return dict(d)
    
    print(parse_csv_by_field('a.csv', fieldnames=['cattle', 'cost']))
    

    【讨论】:

    • 为什么是extend 而不是append
    • 哎呀,我应该使用 append 没有你是对的列表!
    【解决方案2】:

    一个简单的熊猫解决方案:

    import pandas as pd
    df = pd.read_csv('filename', dtype='float') #you wanted float datatype
    dict = df.to_dict(orient='list')
    

    如果你想坚持使用常规 python:

    import csv
    with open(filename, 'r') as f:
        l = list(csv.reader(f))
        dict = {i[0]:[float(x) for x in i[1:]] for i in zip(*l)}
    

    或者,如果你是像亚当·斯密那样的 Python 大师:

    import csv
    with open(filename, 'r') as f:
        l = list(csv.reader(f))
        dict = {header: list(map(float, values)) for header, *values in zip(*l)}
    

    【讨论】:

    • pandas,可能是.to_dict(orient='list') 会给出想要的结果
    • 另外,我认为将dict 命名为其他变量名称my_dict 是很好的。如果您尝试:my_dict = {i[0]:list(i[1:]) for i in zip(*l)},它将为my_dict 中的值提供列表而不是元组
    • 善用cols = zip(*rows) 成语。我可以建议my_dict = {header: values for header, *values in zip(*l)} 吗? (仅在py3中有效)
    • @0p3n5ourcE 结果我不明白,但您可以在转换为浮点数时将其转换为列表
    • @Primusa 您可以通过将header: values 替换为header: map(float, values)header: [float(v) for v in values] 来保留float 演员表
    猜你喜欢
    • 2015-06-13
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2018-04-07
    • 2020-02-05
    相关资源
    最近更新 更多