在尝试压平它后,我有一个 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
对象中。这个Index
对象可以有一个名称,因此“Attributes”是列的名称(非常奇怪的概念,这对于普通索引来说并不是非常有用 - 但在使用多索引
)。reset_index()
看来您的“Symbols”列实际上并不是一列(这就是为什么它没有出现在df.columns
中,而是出现在数据帧的索引。添加此方法会将“Symbols”索引作为列插入到数据帧中,并创建一个新索引,该索引是一个简单的RangeIndex
,范围从 0 到数据帧的长度。
关于python - Pandas 扁平化分层多索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64456503/