从字典的每个数据框中提取具有相同名称的列
Extract the columns with the same name out of each dataframe of a dictionary
我的文件夹中有几个从 Yahoo finance 下载的 csv 文件(每个文件的列数相同,名称相同,行数相同),我试图一次性将它们读入 python .我尝试了 12 个文件。
每个文件都有 Date
、High
、Low
、Close
、Adj Close
、Volume
、
列
网上查了一下,我的代码如下:
csvs = [x for x in os.listdir('.') if x.endswith('.csv')]
fns = [os.path.splitext(os.path.basename(x))[0] for x in csvs]
d = {}
for i in range(len(fns)):
d[fns[i]] = pd.read_csv(csvs[i])
print(d)
然后我得到 d
,它由 12 个数据框组成(每个数据框都有 Date
和 Close
列以及其他同名的列。
现在我正在努力研究如何从字典 d
中提取每个数据帧的 'Date' 和 'Close' 并作为新数据帧加入(一列为 Date
和 12 列因为 Close
,日期相同),并在 d
?
中保留 Close
列名称作为数据框的名称
我试过创建这样的列表
df_list = [d['AAPL'], d['AMD'], d['BIDU'], d['GOOGL'],d['MSFT'], d['NVDA'], d['NXPI'], d['QCOM'], d['SWKS'], d['TXN'], d['^IXIC'], d['^NDXT']]
然后像这样一步一步
aapl = df_list[0]
amd = df_list[1]
bidu = df_list[2]
googl = df_list[3]
msft = df_list[4]
nvda = df_list[5]
nxpi = df_list[6]
qcom = df_list[7]
swks = df_list[8]
txn = df_list[9]
ixic = df_list[10]
ndxt = df_list[11]
mydf = pd.concat([aapl[['Date', 'Close']], amd[['Close']]], axis = 1)
mydf = pd.concat([mydf, bidu[['Close']]], axis = 1)
mydf = pd.concat([mydf,googl[['Close']]], axis = 1)
mydf = pd.concat([mydf,msft[['Close']]], axis = 1)
mydf = pd.concat([mydf,nvda[['Close']]], axis = 1)
mydf = pd.concat([mydf,nxpi[['Close']]], axis = 1)
mydf = pd.concat([mydf,qcom[['Close']]], axis = 1)
mydf = pd.concat([mydf,swks[['Close']]], axis = 1)
mydf = pd.concat([mydf,txn[['Close']]], axis = 1)
mydf = pd.concat([mydf,ixic[['Close']]], axis = 1)
mydf = pd.concat([mydf,ndxt[['Close']]], axis = 1)
然后我得到了我的数据框,其中一列为 Date
,12 列为 Close
,但列的标签都是 Close
.
我得到的dataframe是这样的:
日期
关闭
关闭
关闭
关闭
关闭
关闭
关闭
关闭
关闭
关闭
关闭
关闭
2011-06-02
1
2
2
2
2
2
2
2
2
2
2
2
2011-06-03
1
2
2
2
2
2
2
2
2
2
2
2
2011-06-04
1
2
2
2
2
2
2
2
2
2
2
2
2011-06-05
1
2
2
2
2
2
2
2
2
2
2
2
...
...
...
...
...
...
...
...
...
...
...
...
...
2021-05-28
1
2
2
2
2
2
2
2
2
2
2
2
一共有2515行,数字1/2只是举例。
我想知道
- 如何更改列的标签,我的期望是这样的(对于IXIC和NDXT,原始文件名是
^IXIC
和^NDXT
):
日期
AAPL
AMD
百度
GOOGL
微软
英伟达
恩智浦
高通
SWKS
TXN
伊克斯
NDXT
2011-06-02
1
2
2
2
2
2
2
2
2
2
2
2
2011-06-03
1
2
2
2
2
2
2
2
2
2
2
2
2011-06-04
1
2
2
2
2
2
2
2
2
2
2
2
2011-06-05
1
2
2
2
2
2
2
2
2
2
2
2
...
...
...
...
...
...
...
...
...
...
...
...
...
2021-05-28
1
2
2
2
2
2
2
2
2
2
2
2
- 我怎样才能使代码更简单,这样我就不需要像 'AAPL' 那样编写任何硬代码,因为我有数百个文件,像这样一步一步地创建这个简单的数据框会很糟糕我已经做了。
我是 Python 的新手,正在玩数据帧。希望我已经清楚地解释了我的问题,我们将不胜感激。
您应该一次性阅读这些文件并将它们拆开。
一个示例代码(因为我没有你的输入文件)来勾勒这个想法...
from glob import glob
import pandas as pd
def read_file(f):
df = pd.read_csv(f)
df['ticker'] = f.split('.')[0].strip('^')
return df
df = pd.concat([read_file(f) for f in glob('*.csv')])
df = df.set_index(['Date','ticker'])[['Close']].unstack()
我的文件夹中有几个从 Yahoo finance 下载的 csv 文件(每个文件的列数相同,名称相同,行数相同),我试图一次性将它们读入 python .我尝试了 12 个文件。
每个文件都有 Date
、High
、Low
、Close
、Adj Close
、Volume
、
网上查了一下,我的代码如下:
csvs = [x for x in os.listdir('.') if x.endswith('.csv')]
fns = [os.path.splitext(os.path.basename(x))[0] for x in csvs]
d = {}
for i in range(len(fns)):
d[fns[i]] = pd.read_csv(csvs[i])
print(d)
然后我得到 d
,它由 12 个数据框组成(每个数据框都有 Date
和 Close
列以及其他同名的列。
现在我正在努力研究如何从字典 d
中提取每个数据帧的 'Date' 和 'Close' 并作为新数据帧加入(一列为 Date
和 12 列因为 Close
,日期相同),并在 d
?
Close
列名称作为数据框的名称
我试过创建这样的列表
df_list = [d['AAPL'], d['AMD'], d['BIDU'], d['GOOGL'],d['MSFT'], d['NVDA'], d['NXPI'], d['QCOM'], d['SWKS'], d['TXN'], d['^IXIC'], d['^NDXT']]
然后像这样一步一步
aapl = df_list[0]
amd = df_list[1]
bidu = df_list[2]
googl = df_list[3]
msft = df_list[4]
nvda = df_list[5]
nxpi = df_list[6]
qcom = df_list[7]
swks = df_list[8]
txn = df_list[9]
ixic = df_list[10]
ndxt = df_list[11]
mydf = pd.concat([aapl[['Date', 'Close']], amd[['Close']]], axis = 1)
mydf = pd.concat([mydf, bidu[['Close']]], axis = 1)
mydf = pd.concat([mydf,googl[['Close']]], axis = 1)
mydf = pd.concat([mydf,msft[['Close']]], axis = 1)
mydf = pd.concat([mydf,nvda[['Close']]], axis = 1)
mydf = pd.concat([mydf,nxpi[['Close']]], axis = 1)
mydf = pd.concat([mydf,qcom[['Close']]], axis = 1)
mydf = pd.concat([mydf,swks[['Close']]], axis = 1)
mydf = pd.concat([mydf,txn[['Close']]], axis = 1)
mydf = pd.concat([mydf,ixic[['Close']]], axis = 1)
mydf = pd.concat([mydf,ndxt[['Close']]], axis = 1)
然后我得到了我的数据框,其中一列为 Date
,12 列为 Close
,但列的标签都是 Close
.
我得到的dataframe是这样的:
日期 | 关闭 | 关闭 | 关闭 | 关闭 | 关闭 | 关闭 | 关闭 | 关闭 | 关闭 | 关闭 | 关闭 | 关闭 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2011-06-02 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
2011-06-03 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
2011-06-04 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
2011-06-05 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2021-05-28 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
一共有2515行,数字1/2只是举例。
我想知道
- 如何更改列的标签,我的期望是这样的(对于IXIC和NDXT,原始文件名是
^IXIC
和^NDXT
):
日期 | AAPL | AMD | 百度 | GOOGL | 微软 | 英伟达 | 恩智浦 | 高通 | SWKS | TXN | 伊克斯 | NDXT |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2011-06-02 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
2011-06-03 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
2011-06-04 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
2011-06-05 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2021-05-28 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
- 我怎样才能使代码更简单,这样我就不需要像 'AAPL' 那样编写任何硬代码,因为我有数百个文件,像这样一步一步地创建这个简单的数据框会很糟糕我已经做了。
我是 Python 的新手,正在玩数据帧。希望我已经清楚地解释了我的问题,我们将不胜感激。
您应该一次性阅读这些文件并将它们拆开。 一个示例代码(因为我没有你的输入文件)来勾勒这个想法...
from glob import glob
import pandas as pd
def read_file(f):
df = pd.read_csv(f)
df['ticker'] = f.split('.')[0].strip('^')
return df
df = pd.concat([read_file(f) for f in glob('*.csv')])
df = df.set_index(['Date','ticker'])[['Close']].unstack()