pandas 数据框不会对列重新排序
pandas dataframe won't reorder columns
我正在编写一个脚本来从 Quandl 中检索数据,该脚本在保存之前处理数据。我卡在了 1 个步骤,我喜欢使用 pandas 重新排序我的列,比如 df = df[['Code','Date','Open','High','Low','Close','Volume']]
或者更简单地说,用代码
交换日期
我以为这是因为系统自动将日期设置为索引,但是回溯显示 ['Date'] not in index
我观察到日期标签在 df.index = df.index.strftime('%Y%m%d')
、Print 2 输出时从数据框中丢失。如果我将此行注释掉,错误代码仍然存在。
我尝试插入 df.set_index('Code')
以查看更改索引是否有帮助,但没有。
有人知道这里的问题是什么吗?
代码
myArr = ['CHRIS/CME_AD1']
cDate=int(time.strftime("%Y%m%d"))
# get quandl data, edit dataframe & save to csv
for qCode in myArr:
data = qdl.get(qCode, start_date=StartDate)
df = pd.DataFrame(data)
# df.to_dict()
qID=(str(qCode[qCode.find('/')+1:]))
print(df)
# format data & save
df.insert(loc=0, column='Code', value=qID)
df=df.drop(columns=['Change','Settle','Previous Day Open Interest'])
df.rename(columns={'Last':'Close'}, inplace=True)
df.index = df.index.strftime('%Y%m%d')
print(df)
df = df[['Code','Date','Open','High','Low','Close','Volume']] #reorder columns
df.to_csv(path + qID + '_' + str(cDate) + '.txt', sep=',', index=True, header=1)
print('Quandl Download Complete')
回溯
Traceback (most recent call last):
File "\progsql\SQL\Script\Python\EOD_Quandl - Copy.py", line 29, in <module>
df = df[['Code','Date','Open','High','Low','Close','Volume']] #reorder columns
File "C:\Python35\lib\site-packages\pandas\core\frame.py", line 2679, in __getitem__
return self._getitem_array(key)
File "C:\Python35\lib\site-packages\pandas\core\frame.py", line 2723, in _getitem_array
indexer = self.loc._convert_to_indexer(key, axis=1)
File "C:\Python35\lib\site-packages\pandas\core\indexing.py", line 1327, in _convert_to_indexer
.format(mask=objarr[mask]))
KeyError: "['Date'] not in index"
打印 1 - 来自 Quandl
Open ... Previous Day Open Interest
Date ...
2018-05-10 0.7460 ... 159970.0
2018-05-11 0.7534 ... 164459.0
2018-05-14 0.7543 ... 167173.0
2018-05-15 0.7526 ... 169622.0
2018-05-16 0.7473 ... 170863.0
2018-05-17 0.7516 ... 164165.0
2018-05-18 0.7513 ... 164628.0
2018-05-21 0.7529 ... 161673.0
2018-05-22 0.7586 ... 147136.0
2018-05-23 0.7575 ... 147454.0
2018-05-24 0.7568 ... 153308.0
2018-05-25 0.7578 ... 151199.0
[12 rows x 8 columns]
打印 2 - post 操纵
Code Open High Low Close Volume
20180510 CME_AD1 0.7460 0.7540 0.7455 0.7534 125257.0
20180511 CME_AD1 0.7534 0.7567 0.7522 0.7538 93512.0
20180514 CME_AD1 0.7543 0.7565 0.7525 0.7529 72806.0
20180515 CME_AD1 0.7526 0.7538 0.7449 0.7471 129077.0
20180516 CME_AD1 0.7473 0.7524 0.7448 0.7514 125867.0
20180517 CME_AD1 0.7516 0.7548 0.7498 0.7509 108841.0
20180518 CME_AD1 0.7513 0.7529 0.7489 0.7511 87656.0
20180521 CME_AD1 0.7529 0.7588 0.7504 0.7583 118843.0
20180522 CME_AD1 0.7586 0.7607 0.7567 0.7576 104227.0
20180523 CME_AD1 0.7575 0.7584 0.7523 0.7558 149203.0
20180524 CME_AD1 0.7568 0.7584 0.7543 0.7579 102328.0
20180525 CME_AD1 0.7578 0.7591 0.7543 0.7549 85082.0
'Date' 有你的数据框的索引名称,不是其中一列,所以你不能 "reorder" 它与其他列一起。
我花了一些时间研究 pd.Dataframe.set_index
和 pd.Dataframe.reset_index
的解决方案,但原始索引一直存在。
由于索引不能被视为列并且 df 必须有一个索引,所以我想到了以下想法:
- 重命名索引
- 将其复制到列
- 重新排序列
- 用 index=False
保存 to_csv
虽然有点啰嗦,但在这种情况下完成了任务。
# format data & save
df.index.names = ['ID']
df['Date'] = df.index
df.insert(loc=0, column='Code', value=qID)
df=df.drop(columns=['Change','Settle','Previous Day Open Interest'])
df.rename(columns={'Last':'Close'}, inplace=True)
df.index = df.index.strftime('%Y%m%d')
df = df[['Code','Date','Open','High','Low','Close','Volume']] #reorder columns
df.to_csv(path + qID + '_' + str(cDate) + '.txt', sep=',', index=False, header=0)
print(df)
我正在编写一个脚本来从 Quandl 中检索数据,该脚本在保存之前处理数据。我卡在了 1 个步骤,我喜欢使用 pandas 重新排序我的列,比如 df = df[['Code','Date','Open','High','Low','Close','Volume']]
或者更简单地说,用代码
我以为这是因为系统自动将日期设置为索引,但是回溯显示 ['Date'] not in index
我观察到日期标签在 df.index = df.index.strftime('%Y%m%d')
、Print 2 输出时从数据框中丢失。如果我将此行注释掉,错误代码仍然存在。
我尝试插入 df.set_index('Code')
以查看更改索引是否有帮助,但没有。
有人知道这里的问题是什么吗?
代码
myArr = ['CHRIS/CME_AD1']
cDate=int(time.strftime("%Y%m%d"))
# get quandl data, edit dataframe & save to csv
for qCode in myArr:
data = qdl.get(qCode, start_date=StartDate)
df = pd.DataFrame(data)
# df.to_dict()
qID=(str(qCode[qCode.find('/')+1:]))
print(df)
# format data & save
df.insert(loc=0, column='Code', value=qID)
df=df.drop(columns=['Change','Settle','Previous Day Open Interest'])
df.rename(columns={'Last':'Close'}, inplace=True)
df.index = df.index.strftime('%Y%m%d')
print(df)
df = df[['Code','Date','Open','High','Low','Close','Volume']] #reorder columns
df.to_csv(path + qID + '_' + str(cDate) + '.txt', sep=',', index=True, header=1)
print('Quandl Download Complete')
回溯
Traceback (most recent call last):
File "\progsql\SQL\Script\Python\EOD_Quandl - Copy.py", line 29, in <module>
df = df[['Code','Date','Open','High','Low','Close','Volume']] #reorder columns
File "C:\Python35\lib\site-packages\pandas\core\frame.py", line 2679, in __getitem__
return self._getitem_array(key)
File "C:\Python35\lib\site-packages\pandas\core\frame.py", line 2723, in _getitem_array
indexer = self.loc._convert_to_indexer(key, axis=1)
File "C:\Python35\lib\site-packages\pandas\core\indexing.py", line 1327, in _convert_to_indexer
.format(mask=objarr[mask]))
KeyError: "['Date'] not in index"
打印 1 - 来自 Quandl
Open ... Previous Day Open Interest
Date ...
2018-05-10 0.7460 ... 159970.0
2018-05-11 0.7534 ... 164459.0
2018-05-14 0.7543 ... 167173.0
2018-05-15 0.7526 ... 169622.0
2018-05-16 0.7473 ... 170863.0
2018-05-17 0.7516 ... 164165.0
2018-05-18 0.7513 ... 164628.0
2018-05-21 0.7529 ... 161673.0
2018-05-22 0.7586 ... 147136.0
2018-05-23 0.7575 ... 147454.0
2018-05-24 0.7568 ... 153308.0
2018-05-25 0.7578 ... 151199.0
[12 rows x 8 columns]
打印 2 - post 操纵
Code Open High Low Close Volume
20180510 CME_AD1 0.7460 0.7540 0.7455 0.7534 125257.0
20180511 CME_AD1 0.7534 0.7567 0.7522 0.7538 93512.0
20180514 CME_AD1 0.7543 0.7565 0.7525 0.7529 72806.0
20180515 CME_AD1 0.7526 0.7538 0.7449 0.7471 129077.0
20180516 CME_AD1 0.7473 0.7524 0.7448 0.7514 125867.0
20180517 CME_AD1 0.7516 0.7548 0.7498 0.7509 108841.0
20180518 CME_AD1 0.7513 0.7529 0.7489 0.7511 87656.0
20180521 CME_AD1 0.7529 0.7588 0.7504 0.7583 118843.0
20180522 CME_AD1 0.7586 0.7607 0.7567 0.7576 104227.0
20180523 CME_AD1 0.7575 0.7584 0.7523 0.7558 149203.0
20180524 CME_AD1 0.7568 0.7584 0.7543 0.7579 102328.0
20180525 CME_AD1 0.7578 0.7591 0.7543 0.7549 85082.0
'Date' 有你的数据框的索引名称,不是其中一列,所以你不能 "reorder" 它与其他列一起。
我花了一些时间研究 pd.Dataframe.set_index
和 pd.Dataframe.reset_index
的解决方案,但原始索引一直存在。
由于索引不能被视为列并且 df 必须有一个索引,所以我想到了以下想法:
- 重命名索引
- 将其复制到列
- 重新排序列
- 用 index=False
to_csv
虽然有点啰嗦,但在这种情况下完成了任务。
# format data & save
df.index.names = ['ID']
df['Date'] = df.index
df.insert(loc=0, column='Code', value=qID)
df=df.drop(columns=['Change','Settle','Previous Day Open Interest'])
df.rename(columns={'Last':'Close'}, inplace=True)
df.index = df.index.strftime('%Y%m%d')
df = df[['Code','Date','Open','High','Low','Close','Volume']] #reorder columns
df.to_csv(path + qID + '_' + str(cDate) + '.txt', sep=',', index=False, header=0)
print(df)