首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pandas将多列索引应用于数据帧

问pandas将多列索引应用于数据帧
EN

Stack Overflow用户
提问于 2016-08-09 19:44:50
回答 1查看 176关注 0票数 1

实际情况是,我有几个文件,其中包含具有多个字段的各种股票的time_series数据。每个文件都包含

代码语言:javascript
复制
time, open, high, low, close, volume

目标是将所有这些都放入表单的一个数据帧中

代码语言:javascript
复制
field      open                              high                            ...
security    hk_1      hk_2      hk_3 ...      hk_1      hk_2      hk_3 ...  ...
time
t_1      open_1_1  open_2_1  open_3_1 ...  high_1_1  high_2_1  high_3_1 ...  ...            
t_2      open_1_2  open_2_2  open_3_2 ...  high_1_2  high_2_2  high_3_2 ...  ...
...        ...        ...       ... ...       ...       ...       ... ...  ...

我创建了一个多索引

代码语言:javascript
复制
fields = ['time','open','high','low','close','volume','numEvents','value']
midx = pd.MultiIndex.from_product([security_name'], fields], names=['security', 'field'])

首先,尝试将多索引应用于我从csv读取数据获得的数据帧(通过创建新的数据帧并添加索引)

代码语言:javascript
复制
for c in eqty_names_list:

    midx = pd.MultiIndex.from_product([[c], fields], names=['security', 'field'])

    df_temp = pd.read_csv('{}{}.csv'.format(path, c))
    df_temp = pd.DataFrame(df_temp, columns=midx, index=df_temp['time'])
    df_temp.df_name = c
    all_dfs.append(df_temp)

但是,新的数据帧只包含nan

代码语言:javascript
复制
security    1_HK
field       time    open    high    low     close   volume
time                                
 NaN         NaN     NaN     NaN    NaN       NaN      NaN

此外,它仍然包含一个时间列,尽管我尝试将其设置为索引(以便稍后可以通过索引连接其他股票的所有其他数据帧,以获得聚合的数据帧)。

如何在不丢失数据的情况下将多索引应用于数据帧,然后像下面这样连接数据帧

代码语言:javascript
复制
security    1_HK
field       time    open    high    low     close   volume
time

创建类似的东西(注意,层次结构字段和安全性是互换的)

代码语言:javascript
复制
field       time                open    high        ...
security    1_HK    2_HK ...    1_HK    2_HK ...    ...
time
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-09 19:54:02

我认为你可以首先让所有的文件列出列,然后通过列表理解获得所有的列,然后按列concat (axis=1)。如果添加参数keys,则会得到列中的Multiindex:

文件:

a.csv、b.csv、c.csv

代码语言:javascript
复制
import pandas as pd
import glob

files = glob.glob('files/*.csv')
dfs = [pd.read_csv(fp) for fp in files]

eqty_names_list = ['hk1','hk2','hk3']
df = pd.concat(dfs, keys=eqty_names_list, axis=1)

print (df)
  hk1       hk2       hk3      
    a  b  c   a  b  c   a  b  c
0   0  1  2   0  9  6   0  7  1
1   1  5  8   1  6  4   1  3  2

最后需要swaplevel和sort_index

代码语言:javascript
复制
df.columns = df.columns.swaplevel(0,1)
df = df.sort_index(axis=1)
print (df)
    a           b           c        
  hk1 hk2 hk3 hk1 hk2 hk3 hk1 hk2 hk3
0   0   0   0   1   9   7   2   6   1
1   1   1   1   5   6   3   8   4   2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38849812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档