我有一个大型数据框,其中包含日期,然后是顶部的股票,其中包含价格数据列。
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
每次读取文件似乎效率低下。也许有一种方法可以在文件中读取一次然后创建数据帧。任何帮助将不胜感激。
答案 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())