融化多索引数据框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:如何从对称的多索引数据框中提取值