【问题标题】:How to load data from multiple CSV files into nested dictionary?如何将多个 CSV 文件中的数据加载到嵌套字典中?
【发布时间】:2020-12-27 01:57:29
【问题描述】:

我有多个以日期为文件名的 CSV 文件 (dd-mm-yyyy.csv)。所有文件都采用以下格式,包括日期值作为列值:

date,        id,     name,   value1, value2, value3
03-09-2020,   3,     ACME,     123,    456,    789

如何根据 id 将一个目录中所有文件的数据合并到嵌套字典中?例如,对于 id=3,它看起来像:

dictionary = {'id': 3 
{name: 'ACME' 
{'date': '03-09-2020' {'value1': 123, 'value2': 456, 'value3': 789}}
{'date': '02-09-2020' {'value1': 987, 'value2': 654, 'value3': 321}}
{'date': '01-09-2020' {'value1': 231, 'value2': 564, 'value3': 979}}}}

我的目标是将所有包含每日数据的文件合并到一个主文件中。有人可以帮我解决这个问题吗?提前谢谢!

【问题讨论】:

  • 使用嵌套字典并不是真正必要的,除非你需要它来做其他事情,否则它是非常不切实际的。

标签: python json pandas csv dictionary


【解决方案1】:

我建议采用以下结构:

d={3 : {'name':'ACME', 'values':{ 
'03-09-2020': {'value1': 123, 'value2': 456, 'value3': 789},
'04-09-2020': {'value1': 100, 'value2': 200, 'value3': 300}, 
.....}}}

构建它的代码如下

import pandas as pd:
def load_file(file):
    df=pd.read_csv('newcv.txt', sep=',')

    for i in range(len(df)):
        d[df['id'].iloc[i]]['name']=df['name'].iloc[i]
        d[df['id'].iloc[i]]['values'][df['date'].iloc[i]['value1']=df['value1'].iloc[i]]
        d[df['id'].iloc[i]]['values'][df['date'].iloc[i]['value2']=df['value2'].iloc[i]]
        d[df['id'].iloc[i]]['values'][df['date'].iloc[i]['value3']=df['value3'].iloc[i]]

您可以对目录中的文件运行此函数

【讨论】:

  • 您好弓箭手,感谢您迄今为止的帮助。我已经尝试了上面的代码并得到SyntaxError: invalid syntax 和指向该行末尾括号的箭头:d[df['id'].iloc[i]]['values'][df['date'].iloc[i]]['value1']=df['value1'].iloc[i]]
【解决方案2】:

如果您的唯一目标是合并所有文件:

import os

files = os.listdir(directory) # insert your directory
files = [file for file in files if '.csv' in file]

cols = []
data = []

for file in files:
    with open(directory + '/' + file, 'r') as f:
        text = f.read().split('\n')
        cols = text[0].replace(' ', '')
        data += text[1:-1] # remove column names and blank at end of csv

data = [line.replace(' ', '').split(',') for line in data] # assuming there is a comma and tab between columns
data = sorted(data, key=lambda x: (int(x[1]), x[2], x[0])) # sort data by id, then name, then date

with open('master.csv', 'w+') as f:
    data = [cols] + [','.join(line) for line in data]
    f.write('\n'.join(data))

【讨论】:

  • 嗨,hhaefliger,由于某种原因,我收到了FileNotFoundError: [Errno 2] No such file or directory: '04-08-2020.csv',但我的文件位于所选目录中。你知道我为什么会收到这个错误吗?
  • 运行此循环后抛出此错误:for file in files:
  • 您好,抱歉,我忘记在之前添加目录/
  • 我已经修好了
  • 感谢您的帮助!循环现在起作用了,直到这一刻我才得到:data = sorted(data, key=lambda x: (int(x[1]), x[2], x[0])) 运行后它说IndexError: list index out of range 我想知道是否应该更改此行中的任何内容?
【解决方案3】:

您的示例字典无效,因此不需要解释。

我建议使用 set_index()lambda 函数的组合来生成 dict 的值,然后是 to_dict()

import io
df = pd.read_csv(io.StringIO("""date,id,name,value1,value2,value3
03-09-2020,3,ACME,123,456,789
02-09-2020,3,ACME,987,654,321"""), sep=",")
(df.set_index(["id","date"])
 .assign(values=lambda x: x.apply(lambda r: {k:v for k,v in r.items() if "value" in k}, axis=1))
 .loc[:,["name","values"]]
 .to_dict(orient="index")
)

输出

{(3, '03-09-2020'): {'name': 'ACME',
  'values': {'value1': 123, 'value2': 456, 'value3': 789}},
 (3, '02-09-2020'): {'name': 'ACME',
  'values': {'value1': 987, 'value2': 654, 'value3': 321}}}

【讨论】:

    猜你喜欢
    • 2020-01-13
    • 1970-01-01
    • 2019-09-04
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多