代码之家  ›  专栏  ›  技术社区  ›  Juan Rodriguez

导入多个CSV文件,从每个文件中选择一列,并用Jupyter Noteboos中的文件名重命名该列

  •  0
  • Juan Rodriguez  · 技术社区  · 6 年前

    我正在尝试从这个kaggle链接导入100个CSV文件- https://www.kaggle.com/natehenderson/nate-s-cryptocurrency-analysis/data

    每个文件都包含不同加密货币的历史信息。

    每个文件如下所示:

    How data looks like

    对于当前的分析,我只需要每个文件的市值列以及作为时间戳的指数。

    因此,对于每个文件,唯一需要的列是市值。 然后,我需要附加每个列&将列的名称替换为文件的名称。

    最终结果应如下所示:

    Final Result

    其中每列包含市值和;每个值应与索引相对应,列的名称应与csv文件的名称相同。

    有什么办法吗?

    1 回复  |  直到 5 年前
        1
  •  0
  •   Martin Evans    6 年前

    以下内容应该可以帮助您开始。这假设您有一个包含所有CSV文件的文件夹,并且每个CSV文件具有相同的格式,即类似于:

    Date,Open,High,Low,Close,Volume,Market Cap
    "Sep 22, 2017",1.23,1.25,1.14,1.24,513898,12916700
    "Sep 23, 2017",1.28,1.35,1.18,1.23,1700200,13448400
    

    当您试图水平写入数据时,需要将所有数据收集到内存中,然后才能写入。该脚本一次读取一个文件,并将每一行分配给一个字典字典。第一个持有 date 第二个包含有该日期条目的所有货币。这个 日期 转换为 datetime 对象,以确保在写入输出CSV文件时可以对其进行正确排序。读取每个文件时,其名称存储在一个集合中,以便提供货币名称的最终列表。

    要输出,将对货币名称进行排序,并显示 DictWriter 用于保存所有值。这样做的好处是为任何丢失的数据存储空值:

    from collections import defaultdict
    from operator import itemgetter
    from datetime import datetime
    import csv
    import glob
    import os
    
    req_cols = itemgetter(0, 6)
    all_data = defaultdict(dict)
    currencies = set()
    date_format1 = '%b %d, %Y'  # e.g. "Sep 22, 2017"
    date_format2 = '%B %d, %Y'  # e.g. "June 22, 2017"
    
    for csv_filename in glob.glob('*.csv'):
        with open(csv_filename, newline='') as f_input:
            currency_name = os.path.splitext(os.path.basename(csv_filename))[0]
            csv_input = csv.reader(f_input)
            header = next(csv_input)
            currencies.add(currency_name)
    
            for row in csv_input:
                date, market_cap = req_cols(row)
    
                try:
                    date = datetime.strptime(date, date_format1)
                except ValueError:      # Try "June 22, 2017"
                    date = datetime.strptime(date, date_format2)
    
                all_data[date][currency_name] = market_cap
    
    currencies = sorted(currencies)
    
    with open('output.csv', 'w', newline='') as f_output:
        header = ['Date'] + currencies
        csv_output = csv.DictWriter(f_output, fieldnames=header)
        csv_output.writeheader()
    
        for date, entries in sorted(all_data.items()):
            entries['Date'] = date.strftime(date_format1)
            csv_output.writerow(entries)