熊猫扁平化多层索引

时间:2020-10-21 04:03:18

标签: python pandas dataframe hierarchical

尝试将其展平后,我有一个熊猫数据框,如下所示:

df = pd.DataFrame(web.DataReader(stocks, 'yahoo', day, day).iloc[0]).unstack(level=0).droplevel(level=0, axis=1)

Attributes     adjClose        close  ...       volume       date
Symbols                               ...                        
FB           261.399994   261.399994  ...   13587000.0 2020-10-19
AAPL         115.980003   115.980003  ...  120639300.0 2020-10-19
AMZN        3207.209961  3207.209961  ...    5223600.0 2020-10-19
GOOG        1534.609985  1534.609985  ...    1607100.0 2020-10-19
NFLX                NaN          NaN  ...          NaN 2020-10-19

我试图将其持久化到数据库中;但是,我在df.columns中看不到Symbols。 为了将df保存为以下格式:

Symbols       adjClose        close  ...       volume       date 
FB           261.399994   261.399994  ...   13587000.0 2020-10-19
AAPL         115.980003   115.980003  ...  120639300.0 2020-10-19
AMZN        3207.209961  3207.209961  ...    5223600.0 2020-10-19
GOOG        1534.609985  1534.609985  ...    1607100.0 2020-10-19
NFLX                NaN          NaN  ...          NaN 2020-10-19

关于如何实现此目标的任何建议?我的数据库在“符号”和“日期”列上有一个组合键。 谢谢。

1 个答案:

答案 0 :(得分:2)

符号是您的数据框架索引,您需要使用reset_index将其放入框架本身。试试这个:

df = (pd.DataFrame(web.DataReader(stocks, 'yahoo', day, day)
      .iloc[0])
      .unstack(level=0)
      .droplevel(level=0, axis=1)
      .rename_axis(columns=None) # Gets rid of the "Attributes"
      .reset_index()             # Puts "Symbols" as an actual column, not as the index
)

我的2位好友:

  • rename_axis,这应该摆脱您的“属性”标题。这主要是出于打印时的视觉目的,但可能会使不习惯使用多索引数据的人失望。基本上,您的列标签存储在Index对象中。这个Index对象可以有一个名称,因此“属性”是您列的名称(非常奇怪的概念,对于普通索引来说不是超级有用,但是在使用{{1 }}。
  • MultiIndex似乎您的“ Symbols”列实际上不是一列(这就是为什么它不出现在reset_index()中,而是出现在数据帧的索引中的原因。添加此方法将插入将“符号”索引作为数据框的一列,并创建一个新的索引,该索引是一个简单的df.columns,范围从0到数据框的长度。