pandas:对来自多个 csv 文件的新数据框中的列使用截断的文件名作为 header,读取特定列,将日期设置为索引

pandas: Use truncated filename as header for column in new dataframe from multiple csv files, read specific columns, set date as index

我阅读了多个与此类似的问题,但并未专门针对此用例。

我在一个文件夹中有多个 ticker.csv 个文件,例如:

ZZZ.TO.csv 包含:

    Date        Open        High        Low         Close       Volume
0   2017-03-14  28.347332   28.347332   27.871055   28.267952   22400
1   2017-03-15  28.320875   28.400254   27.959257   28.188574   39200
2   2017-03-16  28.179758   28.797155   28.126837   28.708954   51600
3   2017-03-17  28.576658   28.691315   28.091559   28.550196   57400

我想创建一个包含每个文件中所有 'Date' 和 'Close' 数据的数据框。将 'Date' 设置为索引,并将每个代码作为最终数据帧中的 header 列。

所以最终的数据框看起来像这样:

Date        FOO.TO      ZOMD.V      ZEN.V       TICKER.BAR
2017-03-14  28.347332   28.347332   27.871055   28.267952
2017-03-15  28.320875   28.400254   27.959257   28.188574
2017-03-16  28.179758   28.797155   28.126837   28.708954
2017-03-17  28.576658   28.691315   28.091559   28.550196

这是我试过的:

import pandas as pd
import glob

path = r'/path_where_files_are/'
all_files = glob.glob(path + "/*.csv")
all_files.sort()
    
fields = ['Date','Close']
list = []

for filename in all_files:
    df = pd.read_csv(filename, header=0, usecols=fields)
    df.set_index(['Date'], inplace=True)
    list.append(df)

frame = pd.concat(list, axis=0)

但它产生:

Date        Close   
2017-03-14  0.050000
2017-09-21  0.040000
2017-09-22  0.040000
2017-10-13  0.100000
2017-10-16  0.110000

欢迎任何帮助。干杯。

有几件事可以帮助您:

  • 您想水平连接,所以使用 pd.concat(..., axis=1)pd.concat(..., axis='columns');
  • 阅读后不要忘记重命名数据框中的“关闭”列;
  • 最好不要覆盖 Python built-ins 的名称——因此不要使用 list,而是使用描述性的内容,例如dfs_to_merge.

你可以试试:

import pandas as pd
import pathlib

path = pathlib.Path(r'./data2')

data = {}
for filename in sorted(path.glob('*.csv')):
    data[filename.stem] = pd.read_csv(filename, index_col='Date', 
                                      usecols=['Date', 'Close'],
                                      parse_dates=['Date']).squeeze()
df = pd.concat(data, axis=1)

输出:

>>> df
                ZEN.V     ZZZ.TO
Date                            
2017-03-14  28.267952  28.267952
2017-03-15  28.188574  28.188574
2017-03-16  28.708954  28.708954
2017-03-17  28.550196  28.550196