使用选定的列从1个Excel文件创建不同的数据框

时间:2016-12-08 02:30:34

标签: python excel dataframe

我有一个大型数据框,其中包含日期,然后是顶部的股票,其中包含价格数据列。

Header 1    Header 2    Header 3    Header 4

========    ========    ========    ========

Date         Stock 1    Stock 2     Stock 3

1/2/2001     2.77        6.00        11.00 

1/3/2001     2.89         6.08       11.10 

1/4/2001     2.86         6.33       11.97 

1/5/2001     2.80         6.58       12.40 

我想要做的是从这个文件中制作多个数据帧,其中包含每个股票的日期和股票价格。所以基本上在这个例子中你将有4个数据帧(该文件有超过1000个,所以这只是一个样本)。所以数据帧将是:

DF1 = Data and Stock 1

DF2 = Data and Stock 2

DF3 = Data and Stock 3

DF4 = Data and Stock 4

然后,我将采用每个数据框,并在创建后为每个数据框添加更多列。

我正在阅读之前的问题并提出了usecols,但我似乎可以正确地编写语法。有人可以帮我吗?如果有更好的方法,请告知。由于我的速度超过1000,因此速度对于运行文件非常重要

这是我到目前为止所做的,但我不确定我是否会走最有效的道路。它给出了以下错误(其中似乎):

>>>> ValueError: The elements of 'usecols' must either be all strings or all integers`
df2 = pd.read_csv('file.csv') 
    # read in Exel file to get column headers from excel
for i in df2: 
a = 0 
    # always want to have 1st (date column) as 1st column in DF
d = pd.read_csv('file.csv',usecols=[a,i]) 
    # Read in file with proper columns, will always be first column 
    #and  add column 1, next loop cols 0,2, next loop 0,3, etc. 
dataf[i] = pd.DataFrame(d) #actually create DataFrame

每次读取文件似乎效率低下。也许有一种方法可以在文件中读取一次然后创建数据帧。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

考虑构建整数对的列表([0,1], [0,2], [0,3]等)以按列对主数据帧进行切片。然后迭代地将数据帧附加到列表中,该列表是一个容器的首选设置(具有类似结构的元素),以避免1000个dfs充斥您的全局环境。

dateparse = lambda x: pd.datetime.strptime(x, '%m/%d/%Y')    
masterdf = pd.read_csv("DataFile.csv", parse_dates=[0], date_parser=dateparse)

colpairs = [[0, i] for i in range(1, len(masterdf.columns))]

dfList = []
for cols in colpairs:    
    dfList.append(masterdf[cols])

print(len(dfList))
print(dfList[0].head())
print(dfList[1].head())

或者,考虑使用股票名称作为容器键的数据框字典,其中 colpairs 带有字符串文字对而不是整数:

colpairs = [['Date', masterdf.columns[i]] for i in range(1, len(masterdf.columns))]

dfDict = {}    
for cols in colpairs:    
    dfDict[cols[1]] = masterdf[cols]

print(len(dfDict))
print(dfDict['Stock 1'].head())
print(dfDict['Stock 2'].head())