pandas - 合并多个DataFrame
这是一个多部分的问题。我总是无法把所有内容结合在一起。我的目标是创建一个数据框(我猜是用多重索引),这样我就可以像下面这样访问它:
ticker = 'GOLD'
date = pd.to_datetime('1978/03/31')
current_bar = df.ix[ticker].ix[date]
那么我可以直接说:current_bar.Last 吗?
无论如何,这里是我加载文件的方式:
In [108]: df = pd.read_csv('GOLD.csv', parse_dates='Date', index_col='Date')
In [109]: df
Out[109]:
Exp Last Volume
Date
1978-03-30 198002 995.6 54
1978-03-31 198002 999.5 78
In [110]: df2 = pd.read_csv('SPX.csv', parse_dates='Date', index_col='Date')
In [111]: df2
Out[111]:
Exp Last Volume
Date
1978-03-30 198003 215.5 25
1978-03-31 198003 214.1 99
理想情况下,我希望它看起来像这样(我想):
ticker GOLD SPX
values Exp Last Volume Exp Last Volume
Date
1978-03-30 198002 995.6 54 198003 215.5 25
1978-03-31 198002 999.5 78 198003 214.1 99
- 我想我的问题是:
- 我该如何使这个数据结构变得层次化(实际上数据有20多个相同的列,每个文件都是这样)
- 我该如何将这些文件合并在一起(我大约有100个文件需要放进一个数据框里)
- 我这样假设是对的吗?我可以直接用:current_bar.Last 来获取值吗?
非常感谢。
1 个回答
4
你可以使用 pd.concat
来把多个数据表(DataFrame)拼接在一起。拼接就是把数据表合并成一个,而 合并 是根据共同的索引或列来连接数据表。当你提供 keys
参数时,你会得到一个分层的索引:
import pandas as pd
df = pd.read_csv('GOLD.csv', parse_dates='Date', index_col='Date', sep='\s+')
df2 = pd.read_csv('SPX.csv', parse_dates='Date', index_col='Date', sep='\s+')
result = pd.concat([df, df2], keys=['GOLD', 'SPX'], names=['ticker']).unstack('ticker')
result = result.reorder_levels([1, 0], axis=1).sortlevel(level=0, axis=1)
print(result)
这会产生
ticker GOLD SPX
Exp Last Volume Exp Last Volume
Date
1978-03-30 198002 995.6 54 198003 215.5 25
1978-03-31 198002 999.5 78 198003 214.1 99
result['Last']
会得到这个数据表:
In [147]: result['Last']
Out[147]:
ticker GOLD SPX
Date
1978-03-30 995.6 215.5
1978-03-31 999.5 214.1
我建议你不要使用 result.Last
这种写法,因为它和 result.last
太相似了,后者会返回一个数据表的方法。
如果你想处理更多的文件,可以使用这样的代码:
import pandas as pd
dfs = list()
for filename in filenames:
df = pd.read_csv(filename, parse_dates='Date', index_col='Date')
# compute moving_mean
dfs.append(df)
keys = [filename[:-4] for filename in filenames]
result = pd.concat(dfs, keys=keys, names=['ticker']).unstack('ticker')
请注意,这需要足够的内存来存放所有的数据表列表,以及足够的内存来存放 result
。