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 到数据框的长度。
我有一个 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 到数据框的长度。