从现有数据帧创建多索引列

问题描述 投票:0回答:1

我收到电子表格中显示的数据。
当它到达时,它看起来像这样:

import pandas as pd, numpy as np
data1 = [['symbol',    'appl',  'goog',  None,     'msft',  None,   None,    None],
         ['date'  ,    'close', 'close', 'volume', 'close', 'open', 'high', 'low'],
         ['1999-01-10', 100,     101,    10000,     102,    102,    104,     105],
         ['1999-01-11', 200,     201,    10000,     202,    202,    204,     205]]

df = pd.DataFrame(data1)
df

这会生成一个如下所示的表格:

我基本上需要通过按符号拆分或分组来迭代这些数据。

因此第一个数据框将仅包含 appl 的

[date, close]
列,

第二个将是

[date, close, volume]
对于 goog

最后一个对于 msft 来说是

[close, open, high, low]

我想做到这一点,如果可以创建一个多索引,并按符号分组,我应该能够正确地对数据帧进行切片并对其进行迭代

df = pd.DataFrame(data1)
df = df.ffill(axis=1)
#add first column by using first row
df.columns = df[:1].values.tolist()
df = df[1:]
df.columns = [df.columns, df[:1].values.tolist()]
#repeat for the fields row (2nd column above, now first column after above line)
#df.columns = pd.MultiIndex.from_product(df.columns.levels + df[:1].values.tolist())
#df.set_axis(pd.MultiIndex.from_product([df.columns, df[:1].values.tolist()]), axis=1)
df

最后一行不起作用。我尝试过的其他一些事情已被注释掉。 我确信无论如何都有更好的方法来做到这一点...请告知您是否可以。
谢谢

python pandas numpy
1个回答
0
投票

代码

# your code
df = pd.DataFrame(data1)
df = df.ffill(axis=1)

# edit code
idx = pd.MultiIndex.from_frame(df.iloc[:2, 1:].T, names=['symbol', 'ohlcv'])
out = (df.iloc[2:, 1:]
       .set_axis(df.iloc[2:, 0].rename('date'))
       .set_axis(idx, axis=1)
)

symbol      appl  goog         msft               
ohlcv      close close volume close open high  low
date                                              
1999-01-10   100   101  10000   102  102  104  105
1999-01-11   200   201  10000   202  202  204  205
© www.soinside.com 2019 - 2024. All rights reserved.