导入多个 CSV 文件,select 每个文件的 1 列并使用 Jupyter Noteboos 中的文件名重命名该列

Import multiple CSV files, select 1 Column from each file & rename the column with the file name in Jupyter Noteboos

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

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

每个文件如下所示:

How data looks like

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

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

最终结果应该是这样的:

Final Result

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

有什么办法可以做到这一点吗?

以下应该可以帮助您入门。这假设您有一个包含所有 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,第二个包含具有该日期条目的所有货币。 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)