融化多索引数据框python

Posted

技术标签:

【中文标题】融化多索引数据框python【英文标题】:Melt multiindex dataframe python 【发布时间】:2020-03-25 13:56:56 【问题描述】:

我正在尝试

数据如下所示:

Attributes  Adj Close       Close           High            Low             Open            Volume
Symbols     AAPL    ACN     AAPL    ACN     AAPL    ACN     AAPL    ACN     AAPL    ACN     AAPL    ACN
Date                                                
2002-01-02  1.444668    19.703959   1.664286    26.209999   1.664286    26.910000   1.568571    25.950001   1.575000    26.900000   132374200.0     900500.0
2002-01-03  1.462029    19.087507   1.684286    25.389999   1.696429    26.270000   1.626429    25.299999   1.642857    26.230000   153001800.0     698200.0
2002-01-04  1.468849    20.824106   1.692143    27.700001   1.710714    28.200001   1.642143    25.240000   1.667143    25.389999   102494000.0     2708500.0

我尝试使用 melt 但不知何故我只能使用一列 Adj Close:

    Date    Ticker     Adj Close 
0   2002-01-02  AAPL    1.444668
1   2002-01-03  AAPL    1.462029
2   2002-01-04  AAPL    1.468849
3   2002-01-07  AAPL    1.419867
4   2002-01-08  AAPL    1.401886

代码是:

df = pd.melt(df_market_data['Adj Close'].reset_index(), id_vars='Date', value_name='Adj Close', var_name='minor').rename(columns='minor': 'Ticker')

当尝试与所有这些人一起做时:

Adj Close       Close           High            Low             Open            Volume

它不工作:

df = pd.melt(df_market_data.reset_index(), id_vars='Date', value_name=['Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume'], var_name='minor').rename(columns='minor': 'Ticker')

代码如下所示:

import pandas as pd
import pandas_datareader.data as pdr
import datetime as dt

ticker_list = ['AAPL','ACN']

start_date = dt.datetime(2002,1,1).date()
end_date = dt.datetime.now().date() - dt.timedelta(days=1)

df_market_data = pdr.DataReader(ticker_list, 'yahoo', start_date, end_date)

df = pd.melt(df_market_data['Adj Close'].reset_index(), id_vars='Date', value_name='Adj Close', var_name='minor').rename(columns='minor': 'Ticker')

【问题讨论】:

【参考方案1】:

stack() 函数用于将指定级别从列堆叠到索引。这里第一层的索引用于接收正确的输出和专用的数据帧输出

df = df_market_data.stack(level = 1).reset_index(level = [0, 1], drop = False).reset_index()

【讨论】:

虽然这可能会回答问题,但它已被标记为待审核。没有解释的答案通常被认为是低质量的。请提供一些评论,说明为什么这是正确答案。

以上是关于融化多索引数据框python的主要内容,如果未能解决你的问题,请参考以下文章

Python,pandas:如何从对称的多索引数据框中提取值

如何从python中的数据框中删除多索引?

在多索引 Python Panda 数据框中过滤多个项目

python pandas:重命名多索引数据框中的单列标签

如何将带有元组键的 python 字典转换为 pandas 多索引数据框?

Python Multiindex - 如何在只有时间作为索引的数据框中创建分层多索引?