Pandas 展平分层多索引

Pandas flatten Hierarchical Multi-index

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

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 中看到符号。 为了将 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

关于如何实现这一点有什么建议吗?我的数据库在符号、日期列上有一个复合键。 谢谢。

Symbols 是您的数据帧索引,您需要使用 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 object 中。这个 Index object 可以有一个名字,所以“属性”是你的列的名字(很奇怪的概念,这对普通索引不是很有用 - 但在使用时有很多用处MultiIndex).
  • reset_index() 看来您的“符号”列实际上并不是一列(这就是为什么它没有出现在 df.columns 中而是出现在数据框的索引中的原因。添加此方法会将“Symbols”索引作为一列插入到数据框中,并创建一个简单的新索引 RangeIndex,范围从 0 到数据框的长度。