Pandas使分层多索引变平



在尝试将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中没有看到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

关于如何实现这一目标,有什么建议吗?我的数据库在符号和日期列上有一个复合键。非常感谢。

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对象中。这个Index对象可以有一个名称;属性";是列的名称(这是一个非常奇怪的概念,对于普通的索引来说不是非常有用,但在使用MultiIndex时非常有用(
  • reset_index()看来你的";符号";列实际上不是一列(这就是为什么它不出现在df.columns中,而是数据帧的索引。添加此方法将把"Symbols"索引作为列插入到数据帧中,并创建一个新索引,该索引是一个从0到数据帧长度的简单RangeIndex

最新更新