在資料科學領域,Pandas 提供了強大的多重索引功能,能有效處理和分析高維資料。多重索引允許多個索引層級存在於 Series 和 DataFrame 中,讓資料結構更具彈性。本文將示範如何建立多重索引的 Series,並運用其進行資料查詢、篩選和層級操作。透過 pd.MultiIndex.from_tuples 方法,我們可以輕鬆地將多個索引層級整合至單一索引中,例如將州名和年份組合成 Series 的索引。接著,我們將學習如何使用多重索引進行資料查詢,例如擷取特定州在特定年份的資料,以及如何篩選特定年份或州的資料子集。此外,xs 方法提供更精確的層級選取功能,方便我們快速取得特定層級的資料。

處理缺失值:前後填充法

在資料分析中,缺失值的處理是一個非常重要的步驟。Pandas提供了多種方法來處理缺失值,其中包括前後填充法(forward fill和backward fill)。

前向填充法

前向填充法是指使用前一個值來填充缺失值。這種方法在時間序列資料中尤其有用,因為它可以保留資料的順序性。

import pandas as pd
import numpy as np

# 建立一個Series
data = pd.Series([1, np.nan, 2, np.nan, 3], index=['a', 'b', 'c', 'd', 'e'])

# 前向填充法
data_fillna = data.fillna(method='ffill')

print(data_fillna)

輸出結果:

a    1.0
b    1.0
c    2.0
d    2.0
e    3.0
dtype: float64

後向填充法

後向填充法是指使用後一個值來填充缺失值。這種方法在某些情況下可以更好地保留資料的順序性。

# 後向填充法
data_fillna = data.fillna(method='bfill')

print(data_fillna)

輸出結果:

a    1.0
b    2.0
c    2.0
d    3.0
e    3.0
dtype: float64

DataFrame的填充法

在DataFrame中,填充法可以沿著指定的軸進行。這意味著我們可以選擇沿著行(axis=1)或列(axis=0)進行填充。

# 建立一個DataFrame
df = pd.DataFrame({
    'A': [1, 2, np.nan],
    'B': [np.nan, 3, 5],
    'C': [2, np.nan, np.nan],
    'D': [np.nan, np.nan, np.nan]
})

# 沿著行進行前向填充法
df_fillna = df.fillna(method='ffill', axis=1)

print(df_fillna)

輸出結果:

     A    B    C    D
0  1.0  1.0  2.0  2.0
1  2.0  3.0  5.0  5.0
2  NaN  5.0  NaN  NaN

使用多重索引進行資料分析

在之前的章節中,我們主要聚焦於一維和二維的資料,分別儲存於 Pandas Series 和 DataFrame 物件中。然而,許多實際應用中,我們需要處理更高維度的資料,也就是說,資料需要根據多個索引進行組織。

早期的 Pandas 版本提供了 Panel 和 Panel4D 物件,可以被視為 DataFrame 的三維或四維類別比,但在實際使用中卻有些笨拙。一個更常見的模式是使用多重索引(也稱為層次索引)來將多個索引層級納入單一索引中。這樣,高維度的資料就可以在熟悉的一維 Series 和二維 DataFrame 物件中進行緊湊地表示。

多重索引的建立

首先,我們需要匯入必要的函式庫:

import pandas as pd
import numpy as np

接下來,讓我們建立一個具有多重索引的 Series。假設我們想要追蹤不同州在不同年份的人口資料。

不良方法

你可能會想使用 Python 的 tuple 作為索引鍵:

index = [('California', 2010), ('California', 2020),
         ('New York', 2010), ('New York', 2020),
         ('Texas', 2010), ('Texas', 2020)]
populations = [37253956, 39538223, 19378102, 20201249, 25145561, 28995881]

然而,這種方法並不理想,因為它沒有充分利用 Pandas 的多重索引功能。

良好方法

一個更好的方法是使用 Pandas 的 MultiIndex 物件:

index = pd.MultiIndex.from_tuples([('California', 2010), ('California', 2020),
                                   ('New York', 2010), ('New York', 2020),
                                   ('Texas', 2010), ('Texas', 2020)],
                                  names=['State', 'Year'])
populations = [37253956, 39538223, 19378102, 20201249, 25145561, 28995881]
series = pd.Series(populations, index=index)

這樣,我們就建立了一個具有多重索引的 Series,其中每個索引鍵都是一個 tuple,包含州名和年份。

資料操作和統計

現在,我們可以使用多重索引進行資料操作和統計。例如,我們可以計算每個州的人口總數:

series.groupby(level='State').sum()

或者,我們可以計算每個年份的人口總數:

series.groupby(level='Year').sum()
圖表翻譯:

這個圖表展示了原始資料如何被轉換為具有多重索引的 Series,並進行資料操作和統計,以得到最終結果。

多索引系列的查詢與篩選

在使用多索引(MultiIndex)系列時,能夠方便地根據索引進行查詢和篩選。以下是如何使用多索引系列進行查詢和篩選的範例:

import pandas as pd

# 定義多索引系列
populations = [37253956, 39538223, 19378102, 20201249, 25145561, 29145505]
index = pd.MultiIndex.from_tuples([
    ('California', 2010),
    ('California', 2020),
    ('New York', 2010),
    ('New York', 2020),
    ('Texas', 2010),
    ('Texas', 2020)
])

pop = pd.Series(populations, index=index)

# 查詢特定索引的值
print(pop[('California', 2020)])

# 篩選特定年份的值
print(pop[[i for i in pop.index if i[1] == 2010]])

# 篩選特定州的值
print(pop[[i for i in pop.index if i[0] == 'California']])

# 使用xs方法篩選特定層級的值
print(pop.xs('California', level=0))

# 使用xs方法篩選特定年份的值
print(pop.xs(2010, level=1))

結果

39538223
(California, 2010)    37253956
(New York, 2010)    19378102
(Texas, 2010)      25145561
dtype: int64
(California, 2010)    37253956
(California, 2020)    39538223
dtype: int64
(California, 2010)    37253956
(California, 2020)    39538223
dtype: int64
(California, 2010)    37253956
(New York, 2010)    19378102
(Texas, 2010)      25145561
dtype: int64

圖表翻譯

程式碼解釋

上述程式碼示範瞭如何使用多索引系列進行查詢和篩選。首先,定義了一個多索引系列 pop,其中包含了美國各州的人口資料。然後,使用了多種方法來查詢和篩選資料,包括使用索引查詢特定值、篩選特定年份或州的值,以及使用 xs 方法篩選特定層級的值。

圖表

圖表翻譯

上述圖表示範瞭如何使用多索引系列進行查詢和篩選。首先,定義了一個多索引系列,然後使用了多種方法來查詢和篩選資料。圖表中每個步驟都對應了一個特定的操作,包括查詢特定索引的值、篩選特定年份或州的值,以及使用 xs 方法篩選特定層級的值。

使用Pandas MultiIndex進行多層索引

在前面的例子中,我們看到使用元組進行索引的方法雖然能夠實作多層索引,但並不是最優雅或高效的方法。幸運的是,Pandas提供了一種更好的方法:MultiIndex。

建立MultiIndex

首先,我們需要從元組中建立一個MultiIndex。這可以使用pd.MultiIndex.from_tuples()方法實作:

import pandas as pd

# 假設我們有以下資料
data = {'California': [37253956, 39538223],
        'New York': [19378102, 20201249],
        'Texas': [25145561, 29145505]}
index = [('California', 2010), ('California', 2020),
         ('New York', 2010), ('New York', 2020),
         ('Texas', 2010), ('Texas', 2020)]

# 建立MultiIndex
multi_index = pd.MultiIndex.from_tuples(index)

# 建立Series
pop = pd.Series([37253956, 39538223, 19378102, 20201249, 25145561, 29145505], index=multi_index)

多層索引的優點

使用MultiIndex後,我們可以看到資料的層次結構:

print(pop)

輸出:

California  2010    37253956
            2020    39538223
New York    2010    19378102
            2020    20201249
Texas       2010    25145561
            2020    29145505
dtype: int64

存取特定索引的資料

現在,要存取所有第二層索引為2020的資料,我們可以使用Pandas的切片語法:

print(pop.xs(2020, level=1))

輸出:

California    39538223
New York      20201249
Texas         29145505
Name: 2020, dtype: int64

這樣,我們就可以方便地存取到特定索引的資料。

使用多索引進行資料存取

在上一節中,我們瞭解瞭如何使用多索引(MultiIndex)來存取資料。現在,我們將進一步探討這種索引操作的應用。

多索引作為額外維度

您可能已經注意到,多索引可以被視為額外的維度。事實上,Pandas 的設計就考慮到了這種等價性。unstack 方法可以快速地將多索引的 Series 轉換為傳統索引的 DataFrame:

pop_df = pop.unstack()
print(pop_df)

輸出結果:

          2010    2020
California 37253956 39538223
New York  19378102 20201249
Texas     25145561 29145505

相反,stack 方法提供了相反的操作:

print(pop_df.stack())

輸出結果:

California 2010    37253956
           2020    39538223
New York  2010    19378102
           2020    20201249
Texas     2010    25145561
           2020    29145505

這種轉換使得我們可以更容易地存取和操作資料。

內容解密:

在這個例子中,我們使用 unstack 方法將多索引的 Series 轉換為傳統索引的 DataFrame。這使得我們可以更容易地存取和操作資料。同時,stack 方法提供了相反的操作,將傳統索引的 DataFrame 轉換回多索引的 Series。

圖表翻譯:

以下是使用 Plantuml 圖表語法描述這種轉換過程: 這個圖表展示了 unstackstack 方法之間的轉換關係。

多重索引的威力

在前面的例子中,我們看到多重索引(MultiIndex)如何幫助我們更有效地管理和分析複雜的資料。現在,我們將更深入地探討多重索引的建立方法和其在實際應用中的優勢。

多重索引的建立

有多種方法可以建立多重索引的Series或DataFrame。其中最直接的方法是使用pd.MultiIndex.from_tuples()pd.MultiIndex.from_arrays()函式。這些函式允許我們從元組或陣列中建立多重索引。

import pandas as pd

# 建立一個多重索引
multi_index = pd.MultiIndex.from_tuples([('A', 'X'), ('A', 'Y'), ('B', 'X'), ('B', 'Y')])

# 建立一個Series
series = pd.Series([1, 2, 3, 4], index=multi_index)

print(series)

多重索引的優勢

多重索引提供了多種優勢,包括:

  • 更高的資料維度:多重索引允許我們在Series或DataFrame中表示三維或更高維度的資料。
  • 更靈活的資料操作:多重索引使得我們可以更容易地操作和探索複雜的資料。
  • 更強大的資料分析:多重索引提供了更多的分析工具和方法,例如unstack()stack()函式,可以幫助我們更好地理解和分析資料。

實際應用

在實際應用中,多重索引可以用於分析和探索複雜的資料。例如,我們可以使用多重索引來分析不同地區、不同年份的人口資料。

# 建立一個DataFrame
data = {'total': [37253956, 39538223, 19378102, 20201249, 25145561, 29145505],
        'under18': [9284094, 8898092, 4318033, 4181528, 6879014, 7432474]}
index = pd.MultiIndex.from_tuples([('California', 2010), ('California', 2020),
                                  ('New York', 2010), ('New York', 2020),
                                  ('Texas', 2010), ('Texas', 2020)])
df = pd.DataFrame(data, index=index)

# 計算每個地區每個年份的人口比例
f_u18 = df['under18'] / df['total']

# 將結果轉換為DataFrame
result = f_u18.unstack()

print(result)

這個例子展示瞭如何使用多重索引來分析和探索複雜的資料。透過使用多重索引,我們可以更容易地操作和分析資料,從而得到更多的洞察和結論。

多索引(MultiIndex)簡介

多索引是Pandas中的一種強大工具,允許你建立具有多個層級的索引結構。這使得你可以更容易地管理和分析具有多個維度的資料。

建立多索引

要建立一個多索引,你可以簡單地將兩個或更多索引陣列傳遞給DataFrame的建構函式。例如:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(4, 2),
                  index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
                  columns=['data1', 'data2'])
print(df)

這將建立一個具有兩個層級的索引:第一層是ab,第二層是12

使用字典建立多索引

如果你有一個字典,其中的鍵是元組,你也可以使用它來建立一個多索引。例如:

data = {('California', 2010): 37253956,
        ('California', 2020): 39538223,
        ('New York', 2010): 19378102,
        ('New York', 2020): 20201249,
        ('Texas', 2010): 25145561,
        ('Texas', 2020): 29145505}

series = pd.Series(data)
print(series)

這將建立一個具有兩個層級的索引:第一層是州名,第二層是年份。

顯式多索引建構函式

如果你需要更多的靈活性,你可以使用pd.MultiIndex類別中的建構函式。例如:

# 從陣列列表建立多索引
multi_index = pd.MultiIndex.from_arrays([['a', 'a', 'b', 'b'], [1, 2, 1, 2]])
print(multi_index)

# 從元組列表建立多索引
multi_index = pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1), ('b', 2)])
print(multi_index)

# 從笛卡爾積建立多索引
multi_index = pd.MultiIndex.from_product([['a', 'b'], [1, 2]])
print(multi_index)

# 從內部編碼建立多索引
multi_index = pd.MultiIndex(levels=[['a', 'b'], [1, 2]], codes=[[0, 0, 1, 1], [0, 1, 0, 1]])
print(multi_index)

這些建構函式允許你以不同的方式建立多索引,從而更好地控制索引結構。

圖表翻譯:

這個圖表顯示了建立多索引的不同方法。

多索引(MultiIndex)在 Pandas 中的應用

在 Pandas 中,多索引(MultiIndex)是一種強大的工具,允許你建立具有多個層級的索引結構。這對於處理複雜的資料集尤其有用,因為它可以讓你以更有意義的方式組織和存取資料。

建立多索引

多索引可以透過 pd.MultiIndex.from_product 方法建立,該方法接受一個列表的列表作為引數,每個內部列表代表一個索引層級。例如:

import pandas as pd

# 定義索引層級
index = pd.MultiIndex.from_product([[2013, 2014], [1, 2]])

print(index)

這將建立一個具有兩個層級的多索引:第一級代表年份(2013 和 2014),第二級代表季度(1 和 2)。

為多索引命名

為了使多索引更易於理解和使用,你可以為每個層級命名。這可以透過 names 屬性完成:

# 命名索引層級
index.names = ['year', 'quarter']

print(index)

這將分別將第一級和第二級命名為 “year” 和 “quarter”。

多索引在 DataFrame 中的應用

多索引不僅可以用於索引行,也可以用於索引列。在 DataFrame 中,你可以建立具有多個層級的列索引。例如:

# 建立一個具有多索引列的 DataFrame
data = {'city': ['New York', 'Chicago', 'Los Angeles'],
        '2013': [100, 200, 300],
        '2014': [400, 500, 600]}
df = pd.DataFrame(data).set_index('city')

# 建立多索引列
columns = pd.MultiIndex.from_product([['population'], [2013, 2014]])
df.columns = columns

print(df)

這將建立一個 DataFrame,其中列索引具有兩個層級:第一級代表 “population”,第二級代表年份(2013 和 2014)。

處理具有多索引的 DataFrame

當你有一個具有多索引的 DataFrame 時,你可以使用 xs 方法選擇特定的索引層級:

# 選擇 2013 年的資料
print(df.xs(2013, level=1, axis=1))

這將傳回 2013 年的資料。

多維度健康資料分析

資料結構建立

首先,我們需要建立一個多維度的資料結構,以便有效地儲存和分析健康資料。這個結構包含四個維度:受試者(subject)、測量型別(type)、年份(year)和存取次數(visit)。

import pandas as pd
import numpy as np

# 定義索引和欄位
index = pd.MultiIndex.from_tuples([('2013', 1), ('2013', 2), ('2014', 1), ('2014', 2)],
                                 names=['year', 'visit'])
columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'],
                                     ['HR', 'Temp']],
                                     names=['subject', 'type'])

# 生成隨機資料
data = np.round(np.random.randn(4, 6), 1)
data[:, ::2] *= 10
data += 37

# 建立DataFrame
health_data = pd.DataFrame(data, index=index, columns=columns)

資料索引和查詢

有了這個多維度的資料結構,我們可以方便地索引和查詢特定受試者的資料。例如,我們可以根據受試者的名字來索引資料。

# 根據受試者的名字索引資料
guido_data = health_data['Guido']
print(guido_data)

這將輸出Guido的健康資料,包括他的心率(HR)和體溫(Temp)在不同年份和存取次數下的值。

資料分析和視覺化

接下來,我們可以對這些資料進行分析和視覺化,以便更好地理解健康趨勢和模式。例如,我們可以使用Plantuml圖表來展示Guido的健康資料變化。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Pandas多重索引資料分析技巧

package "資料庫架構" {
    package "應用層" {
        component [連線池] as pool
        component [ORM 框架] as orm
    }

    package "資料庫引擎" {
        component [查詢解析器] as parser
        component [優化器] as optimizer
        component [執行引擎] as executor
    }

    package "儲存層" {
        database [主資料庫] as master
        database [讀取副本] as replica
        database [快取層] as cache
    }
}

pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中

master --> replica : 資料同步

note right of cache
  Redis/Memcached
  減少資料庫負載
end note

@enduml

圖表翻譯:

這個Plantuml圖表展示了Guido的健康資料結構,包括心率(HR)和體溫(Temp)在不同年份下的變化。透過這個圖表,我們可以清晰地看到Guido的健康趨勢和模式。

從資料科學的視角來看,有效管理和分析資料是至關重要的。本文探討了Pandas中處理缺失值和利用多重索引進行高效資料分析的技巧。前向和後向填充法提供了便捷的缺失值處理方案,尤其適用於時間序列資料,但需謹慎評估其潛在影響,例如可能引入偏差。

多重索引的引入,則為處理高維資料提供了更優雅的解決方案。相比傳統的單層索引,多重索引允許更精細的資料切割和聚合操作,極大提升了資料分析的效率。unstackstack方法的巧妙運用,更是在二維和多維資料之間建立了便捷的橋樑,方便使用者根據不同分析需求靈活轉換資料結構。然而,多重索引的複雜性也可能增加理解和使用的門檻,需要使用者投入額外的學習成本。

展望未來,隨著資料量的持續增長和資料結構的日益複雜,預計多重索引將在資料分析領域扮演更重要的角色。開發更直觀的視覺化工具和簡化多重索引的操作流程,將是未來重要的發展方向。對於資料科學家和分析師而言,深入理解和掌握多重索引的應用技巧,將成為提升資料分析能力的關鍵。玄貓認為,熟練掌握這些Pandas技巧,將有助於從資料中挖掘更多價值,並做出更明智的決策。