close

【Pandas】全網最好懂的df多層級索引、多層索引教學:df的MultiIndex教學(建立、插入、索引)

一、前言

在有時候單一Index或單一columns看不清楚,何不把它合併再一起一同操作!

雖然我這人建議,還不熟悉MultiIndex用起來可能會有點辛苦,單順手之後,蠻舒服的!

再配合excel控制就可以做出各式各樣的報告跟報表還有模板!

廢話不多說,讓我們教學看下去!

 

 

二、MultiIndex教學

其實基本的觀念蠻簡單的,就是你的index跟col可以是一個tuple也就是()的部分。

然後使用pandas.MultiIndex.from_product把多層的index或col建立出來之後再建立df就可操作了。

pandas.MultiIndex.from_product出來的multiindex可以當作index使用或col使用,不要想得太死!

繼續往下看詳細解說。

完整程式碼

import pandas, numpy
import matplotlib.pyplot as plt
import datetime
import twstock


def get_stock(symbol):
    # 取得證交所股票data
    stock = twstock.Stock(symbol)
    symbol = stock.sid # 回傳股票代號
    date = stock.date # 時間
    open = stock.open # 開
    high = stock.high # 高
    low = stock.low # 低
    close = stock.price # 收    
    # 轉成DataFrame
    data = {'Open': open, 
            'High': high, 
            'Low': low, 
            'Close': close}
    df = pandas.DataFrame(data, index=date)
    return df


symbol1 = '2330'
symbol2 = '2454'

df1 = get_stock(symbol1).iloc[5:]
df2 = get_stock(symbol2).iloc[8:]

df2 = df2.iloc[10:]

multi = [[symbol1, symbol2], ['Open', 'High', 'Low', 'Close']] # 第一層[symbol1, symbol2] # 第二層 ['Open', 'High', 'Low', 'Close']
mindex = pandas.MultiIndex.from_product(multi, names=['stock', 'price']) # 給予name 第一層stock 第二層price

# 建立多層df
df_multi = pandas.DataFrame(columns=mindex, index=df1.index) # 多層次標籤可以放在col 也可以放在index
#df_multi = pandas.DataFrame(columns=df1.index, index=mindex)

# 放入資料
df_multi[symbol1] = df1 # 等同於join方式 當天資料有缺或多比照join方式處理給予nan或是省略
df_multi[symbol2] = df2

# 查詢(索引)
df_multi[symbol1] # 查詢股票1全部
df_multi[(symbol1, 'Close')] # 查詢股票1的Close
df_multi.xs(df1.index[-1]) # 交叉索引 查詢symbol1及2的最後一天資料
df_multi.loc[df1.index[-1]] # 同上


multi = [[symbol1, symbol2], ['Open', 'High', 'Low', 'Close']]  初步建立你的multiindex的架構

mindex = pandas.MultiIndex.from_product(multi, names=['stock', 'price']) 給予你的multiindex名稱並且建立

這邊[symbol1, symbol2]對應stock, ['Open', 'High', 'Low', 'Close']對應price,其實names不太重要。

df_multi = pandas.DataFrame(columns=mindex, index=df1.index)接下來就可以建立df了,看你的multiindex要當index或col都可以

一開始有資料可以直接給產生df,如果後面補資料可以直接用df_multi[symbol1] = df1這樣方法等同於join

查詢的話基本款用df_multi[(symbol1, 'Close')] ,其他可以看上面參考

 

 

三、後記

大家pandas是一個非常好用的套件,但卻有很多眉眉角角,也是資料分析的好夥伴,大家還有遇上什麼問題可以留言給我唷!

其他更多pandas教學:https://pixnashpython.pixnet.net/blog/category/461784

 

arrow
arrow

    恩哥Python 發表在 痞客邦 留言(0) 人氣()