Pandas 提供了多元的資料合併方法,除了常見的欄位合併,索引合併也是一種高效的技巧。當資料集已經設定索引,利用索引合併可以簡化程式碼並提升效能。索引合併適用於兩個 DataFrame 的索引代表相同的實體或概念,例如員工編號、日期或產品ID。使用 merge 函式並設定 left_index 和 right_index 引數為 True 即可執行索引合併。此外,join 方法提供更簡潔的語法,直接以索引作為合併鍵。實際應用中,常會遇到需要混合索引和欄位合併的場景。例如,一個 DataFrame 使用員工姓名作為索引,另一個 DataFrame 使用員工編號作為欄位。此時,可以結合 left_index 和 right_on 或 left_on 和 right_index 引數來完成合併。合併過程中,how 引數決定合併型別,例如內部合併、左外合併、右外合併或全外合併,可以根據需求選擇。處理重疊欄位名稱時,suffixes 引數可以避免名稱衝突,確保合併後的 DataFrame 欄位名稱清晰易懂。合併後的 DataFrame 可能存在遺失值,可以使用 isnull() 方法檢查,並根據實際情況選擇填充或刪除遺失值的策略。
合併資料表之索引合併
在進行資料合併時,除了根據欄位進行合併外,我們也可以根據索引進行合併。這種情況通常發生在我們的資料已經根據某個欄位設定了索引,且希望根據這個索引進行合併。
資料準備
首先,我們需要準備兩個資料表:df1a和df2a。這兩個資料表都已經根據employee欄位設定了索引。
import pandas as pd
# 資料表1
data1 = {
'employee': ['Bob', 'Jake', 'Lisa', 'Sue'],
'group': ['Accounting', 'Engineering', 'Engineering', 'HR'],
'salary': [70000, 80000, 120000, 90000]
}
df1a = pd.DataFrame(data1).set_index('employee')
# 資料表2
data2 = {
'employee': ['Bob', 'Jake', 'Lisa', 'Sue'],
'hire_date': [2004, 2008, 2010, 2012]
}
df2a = pd.DataFrame(data2).set_index('employee')
合併資料表
現在,我們可以使用merge函式根據索引進行合併。由於我們的資料表已經根據employee欄位設定了索引,所以我們可以直接使用left_index和right_index引數進行合併。
# 合併資料表
df_merge = pd.merge(df1a, df2a, left_index=True, right_index=True)
結果
合併後的資料表df_merge將包含來自兩個原始資料表的所有欄位。
print(df_merge)
內容解密:
在上述程式碼中,我們首先匯入了pandas函式庫,並建立了兩個資料表df1a和df2a。然後,我們使用set_index方法根據employee欄位設定了索引。接下來,我們使用merge函式根據索引進行合併,指定left_index和right_index引數為True。最後,我們列印預出了合併後的資料表df_merge。
圖表翻譯:
以下是合併過程的Plantuml流程圖:
在這個流程圖中,我們首先載入了原始資料,然後根據employee欄位設定了索引。接下來,我們使用merge函式根據索引進行合併,最後輸出了合併後的結果。
使用索引進行合併
在進行資料合併時,Pandas 提供了多種方法來實作。其中,使用索引進行合併是一種常見的做法。透過設定 left_index 和 right_index 引數,可以指定左邊和右邊的資料框架(DataFrame)使用索引作為合併的鍵。
範例
假設我們有兩個資料框架 df1a 和 df2a,如下所示:
| group | hire_date | employee |
|---|---|---|
| Accounting | 2004 | Bob |
| Engineering | 2008 | Jake |
| Engineering | 2012 | Lisa |
| HR | 2014 | Sue |
| group | employee |
|---|---|
| Accounting | Bob |
| Engineering | Jake |
| Engineering | Lisa |
| HR | Sue |
我們可以使用 pd.merge() 函式進行索引合併,如下所示:
import pandas as pd
# 定義資料框架
df1a = pd.DataFrame({
'group': ['Accounting', 'Engineering', 'Engineering', 'HR'],
'hire_date': [2004, 2008, 2012, 2014],
'employee': ['Bob', 'Jake', 'Lisa', 'Sue']
})
df2a = pd.DataFrame({
'group': ['Accounting', 'Engineering', 'Engineering', 'HR'],
'employee': ['Bob', 'Jake', 'Lisa', 'Sue']
})
# 進行索引合併
merged_df = pd.merge(df1a, df2a, left_index=True, right_index=True)
print(merged_df)
輸出結果如下:
group_x hire_date employee_x group_y employee_y
0 Accounting 2004 Bob Accounting Bob
1 Engineering 2008 Jake Engineering Jake
2 Engineering 2012 Lisa Engineering Lisa
3 HR 2014 Sue HR Sue
使用 DataFrame.join() 方法
除了使用 pd.merge() 函式外,Pandas 還提供了 DataFrame.join() 方法來進行索引合併。這個方法可以簡化合併過程,無需指定額外的引數。
merged_df = df1a.join(df2a, lsuffix='_x', rsuffix='_y')
print(merged_df)
輸出結果與上述相同。
圖表翻譯:
內容解密:
在上述範例中,我們使用 pd.merge() 函式進行索引合併。透過設定 left_index 和 right_index 引數,我們可以指定左邊和右邊的資料框架使用索引作為合併的鍵。這樣可以簡化合併過程,避免需要指定額外的引數。同時,Pandas 的 DataFrame.join() 方法也可以用於進行索引合併,提供了一種簡單的合併方法。
資料合併:混合索引和欄位
在進行資料合併時,Pandas 提供了多種方式來結合資料框(DataFrames)。除了使用 join() 方法外,merge() 函式也是一種常見的合併資料的方法。下面我們將探討如何混合索引和欄位來進行資料合併。
基本合併
首先,讓我們觀察一下基本的資料合併。假設我們有兩個資料框 df1a 和 df2a:
| group | hire_date | employee |
|---|---|---|
| Accounting | 2008 | Bob |
| Engineering | 2012 | Jake |
| Engineering | 2004 | Lisa |
| HR | 2014 | Sue |
當我們使用 df1a.join(df2a) 時,Pandas 會根據索引進行合併。然而,在這個例子中,我們並沒有看到預期的結果,因為 df2a 的索引與 df1a 的索引不匹配。
混合索引和欄位合併
如果你想要混合索引和欄位來進行合併,可以使用 left_index 和 right_on 引數。例如,假設我們有兩個資料框 df1a 和 df3:
df1a:
| group | hire_date | employee |
|---|---|---|
| Accounting | 2008 | Bob |
| Engineering | 2012 | Jake |
| Engineering | 2004 | Lisa |
| HR | 2014 | Sue |
df3:
| name | salary |
|---|---|
| Bob | 70000 |
| Jake | 80000 |
| Lisa | 120000 |
| Sue | 90000 |
現在,如果我們想要根據 df1a 的索引(即員工名稱)和 df3 的 name 欄位進行合併,可以使用以下程式碼:
pd.merge(df1a, df3, left_index=True, right_on='name')
這將會產生以下結果:
| group | hire_date | employee | name | salary |
|---|---|---|---|---|
| Accounting | 2008 | Bob | Bob | 70000 |
| Engineering | 2012 | Jake | Jake | 80000 |
| Engineering | 2004 | Lisa | Lisa | 120000 |
| HR | 2014 | Sue | Sue | 90000 |
圖表翻譯:
此圖示展示瞭如何使用 merge() 函式混合索引和欄位來進行資料合併。左邊的資料框 df1a 根據其索引(員工名稱)與右邊的資料框 df3 根據其 name 欄位進行合併。結果是一個新的資料框,包含了兩個原始資料框的所有欄位。
內容解密:
在上面的例子中,我們使用了 left_index=True 和 right_on='name' 引數來指定合併的基礎。left_index=True 表示左邊的資料框 df1a 的索引將被用作合併的基礎,而 right_on='name' 表示右邊的資料框 df3 的 name 欄位將被用作合併的基礎。這樣就可以實作混合索引和欄位的資料合併。
資料合併與連線
資料合併與連線是資料分析中的一個重要步驟,尤其是在使用 Pandas 這樣的資料處理函式庫時。Pandas 提供了多種方法來合併和連線資料,包括內連線(inner join)、左連線(left join)、右連線(right join)和全外連線(full outer join)。
內連線(Inner Join)
內連線是最常見的一種連線方式,它只傳回兩個資料表中都有的資料。例如,假設我們有兩個資料表,df1 和 df2,它們都有一個名為 name 的欄位,我們可以使用內連線來合併這兩個資料表。
import pandas as pd
# 建立兩個資料表
df1 = pd.DataFrame({'name': ['Peter', 'Paul', 'Mary'],
'food': ['fish', 'beans', 'bread']})
df2 = pd.DataFrame({'name': ['Mary', 'Joseph'],
'drink': ['wine', 'beer']})
# 使用內連接合併資料表
merged_df = pd.merge(df1, df2, on='name', how='inner')
print(merged_df)
左連線(Left Join)
左連線會傳回左邊資料表中的所有資料,以及右邊資料表中匹配的資料。如果右邊資料表中沒有匹配的資料,則會傳回 NaN。
# 使用左連接合併資料表
merged_df = pd.merge(df1, df2, on='name', how='left')
print(merged_df)
右連線(Right Join)
右連線與左連線相反,它會傳回右邊資料表中的所有資料,以及左邊資料表中匹配的資料。
# 使用右連接合併資料表
merged_df = pd.merge(df1, df2, on='name', how='right')
print(merged_df)
全外連線(Full Outer Join)
全外連線會傳回兩個資料表中的所有資料,如果有一邊沒有匹配的資料,則會傳回 NaN。
# 使用全外連接合併資料表
merged_df = pd.merge(df1, df2, on='name', how='outer')
print(merged_df)
指定集合運算
在進行連線時,可以指定集合運算的方式,例如使用 how 引數來指定內連線、左連線、右連線或全外連線。
# 使用內連接合併資料表,並指定集合運算
merged_df = pd.merge(df1, df2, on='name', how='inner', indicator=True)
print(merged_df)
多索引和多欄位連線
Pandas 也支援多索引和多欄位連線,可以使用 on 引數來指定多個索引或欄位。
# 建立兩個資料表,具有多個索引
df1 = pd.DataFrame({'name': ['Peter', 'Paul', 'Mary'],
'age': [25, 30, 35],
'food': ['fish', 'beans', 'bread']})
df2 = pd.DataFrame({'name': ['Mary', 'Joseph'],
'age': [35, 40],
'drink': ['wine', 'beer']})
# 使用多索引連接合併資料表
merged_df = pd.merge(df1, df2, on=['name', 'age'])
print(merged_df)
圖示化說明
以下是使用 Plantuml 圖示化工具來展示內連線、左連線、右連線和全外連線的差異。
圖表翻譯:
上述圖表展示了不同型別的連線方式,包括內連線、左連線、右連線和全外連線。每種連線方式都有其特點和應用場景,瞭解這些差異可以幫助您更好地進行資料分析和處理。
合併資料集:瞭解 Pandas 的 Merge 功能
在資料分析中,合併不同的資料集是常見的需求。Pandas 提供了強大的 merge 函式來完成這項工作。讓我們深入瞭解如何使用 merge 來合併資料集。
內部聯結(Inner Join)
內部聯結是最常見的合併方式,它傳回兩個資料集中共同列的交集。以下是範例:
import pandas as pd
# 定義兩個資料集
df6 = pd.DataFrame({'name': ['Mary', 'Peter', 'Paul'],
'food': ['bread', 'fish', 'beans']})
df7 = pd.DataFrame({'name': ['Mary', 'Joseph'],
'drink': ['wine', 'beer']})
# 內部聯結
result = pd.merge(df6, df7, on='name')
print(result)
輸出結果:
name food drink
0 Mary bread wine
如您所見,內部聯結只傳回兩個資料集中共同的列,即 name 為 Mary 的列。
外部聯結(Outer Join)
外部聯結傳回兩個資料集的聯集,並填充缺失值以 NaN。以下是範例:
# 外部聯結
result = pd.merge(df6, df7, on='name', how='outer')
print(result)
輸出結果:
name food drink
0 Mary bread wine
1 Peter fish NaN
2 Paul beans NaN
3 Joseph NaN beer
如您所見,外部聯結傳回兩個資料集的聯集,並填充缺失值以 NaN。
左聯結(Left Join)和右聯結(Right Join)
左聯結和右聯結分別傳回左邊資料集和右邊資料集的所有列。以下是範例:
# 左聯結
result = pd.merge(df6, df7, on='name', how='left')
print(result)
輸出結果:
name food drink
0 Mary bread wine
1 Peter fish NaN
2 Paul beans NaN
# 右聯結
result = pd.merge(df6, df7, on='name', how='right')
print(result)
輸出結果:
name food drink
0 Mary bread wine
1 Joseph NaN beer
如您所見,左聯結和右聯結分別傳回左邊資料集和右邊資料集的所有列。
左連線和右連線的應用
在進行資料合併時,左連線(left join)和右連線(right join)是兩種常見的操作。左連線傳回左邊資料表的所有列,以及右邊資料表中匹配的列;而右連線則傳回右邊資料表的所有列,以及左邊資料表中匹配的列。
左連線的範例
假設我們有兩個資料表,df6 和 df7,如下所示:
| name | food |
|---|---|
| Peter | fish |
| Paul | beans |
| Mary | bread |
| name | drink |
|---|---|
| Mary | wine |
| Joseph | beer |
進行左連線後,結果如下:
| name | food | drink |
|---|---|---|
| Peter | fish | NaN |
| Paul | beans | NaN |
| Mary | bread | wine |
如上所示,左連線傳回了左邊資料表 (df6) 的所有列,以及右邊資料表 (df7) 中匹配的列。
右連線的範例
如果我們進行右連線,結果如下:
| name | food | drink |
|---|---|---|
| Mary | bread | wine |
| Joseph | NaN | beer |
右連線傳回了右邊資料表 (df7) 的所有列,以及左邊資料表 (df6) 中匹配的列。
處理重疊欄位名稱
在進行資料合併時,可能會遇到兩個輸入資料表具有相同欄位名稱的情況。為了避免欄位名稱衝突,可以使用 suffixes 引數來指定欄位名稱的字尾。
例如,假設我們有兩個資料表,df8 和 df9,如下所示:
| name | age |
|---|---|
| Bob | 25 |
| Jake | 30 |
| Lisa | 28 |
| Sue | 22 |
| name | age |
|---|---|
| Bob | 25 |
| Jake | 31 |
| Lisa | 29 |
| Tom | 24 |
進行合併時,可以使用 suffixes 引數來指定欄位名稱的字尾,如下所示:
pd.merge(df8, df9, on='name', suffixes=('_df8', '_df9'))
結果如下:
| name | age_df8 | age_df9 |
|---|---|---|
| Bob | 25 | 25 |
| Jake | 30 | 31 |
| Lisa | 28 | 29 |
如上所示,使用 suffixes 引數可以避免欄位名稱衝突,並傳回合併後的資料表。
合併資料框(DataFrames)時的欄位名稱衝突處理
當使用 pd.merge() 函式合併兩個資料框(DataFrames)時,如果兩個資料框都包含相同的欄位名稱,合併後的資料框就會產生欄位名稱衝突。為了避免這種衝突,pd.merge() 函式會自動在衝突的欄位名稱後面加上 _x 和 _y 的字尾,以區分來自不同資料框的欄位。
以下是範例程式碼:
import pandas as pd
# 建立兩個資料框
df8 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],
'rank': [1, 2, 3, 4]})
df9 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],
'rank': [3, 1, 4, 2]})
# 合併兩個資料框
merged_df = pd.merge(df8, df9, on="name")
print(merged_df)
輸出結果:
name rank_x rank_y
0 Bob 1 3
1 Jake 2 1
2 Lisa 3 4
3 Sue 4 2
如您所見,合併後的資料框中,rank 欄位被重新命名為 rank_x 和 rank_y,以避免名稱衝突。
如果您不想要使用預設的 _x 和 _y 字尾,可以使用 suffixes 引數自訂字尾。例如:
merged_df = pd.merge(df8, df9, on="name", suffixes=["_L", "_R"])
print(merged_df)
輸出結果:
name rank_L rank_R
0 Bob 1 3
1 Jake 2 1
2 Lisa 3 4
3 Sue 4 2
在這個範例中,我們使用 suffixes=["_L", "_R"] 引數將 _x 和 _y 字尾改為 _L 和 _R。
合併與連線操作
合併與連線是資料分析中兩種常見的操作,尤其是在處理多個來源的資料時。這些操作使我們能夠根據共同的欄位(或索引)將不同的資料集結合起來,以便進行進一步的分析。
基本概念
在進行合併與連線操作之前,瞭解資料集的結構是非常重要的。每個資料集都有一個唯一的索引或鍵,用於識別每一行資料。在合併與連線操作中,我們通常根據這些索引或鍵將不同資料集中的資料行匹配起來。
例子:美國州份資料
讓我們考慮一個例子,涉及美國州份的人口和麵積資料。假設我們有三個不同的資料集:state-population.csv、state-areas.csv和state-abbrevs.csv。這些資料集包含了美國各州的人口資料、面積資料和州份縮寫。
首先,我們需要下載這些資料集:
!cd data && curl -O {repo}/state-population.csv
!cd data && curl -O {repo}/state-areas.csv
!cd data && curl -O {repo}/state-abbrevs.csv
然後,我們可以使用Pandas的read_csv函式讀取這些資料集:
pop = pd.read_csv('data/state-population.csv')
areas = pd.read_csv('data/state-areas.csv')
abbrevs = pd.read_csv('data/state-abbrevs.csv')
顯示每個資料集的前幾行資料,可以幫助我們瞭解資料的結構:
display('pop.head()', 'areas.head()', 'abbrevs.head()')
輸出結果如下:
pop.head()
state/region ages year population
0 AL under18 2012 1117489.0
1 AL total 2012 4817528.0
2 AL under18 2010 1130966.0
3 AL total 2010 4785570.0
areas.head()
state area
0 AL 52420
1 AK 171785
2 AZ 113990
3 AR 53182
abbrevs.head()
state abbrev
0 AL AL
1 AK AK
2 AZ AZ
3 AR AR
合併操作
現在,我們可以根據共同的欄位(例如州份名稱或縮寫)將這些資料集合併起來。Pandas提供了多種合併方式,包括內部合併(inner join)、左外合併(left outer join)、右外合併(right outer join)和全外合併(full outer join)。
例如,如果我們想要根據州份名稱合併人口和麵積資料集,可以使用以下程式碼:
merged_data = pd.merge(pop, areas, on='state/region')
這將產生一個新的資料集,包含了人口和麵積資料。
合併資料集以計算美國州及領地人口排名
要計算美國州及領地的人口排名,我們需要合併兩個資料集:pop 和 abbrevs。前者包含了美國州及領地的人口資料,後者則包含了州的縮寫和全名。
首先,我們檢視 areas 資料集的前幾行,發現它包含了各州的面積資料:
| state | area (sq. mi) |
|---|---|
| Alabama | 52423 |
| Alaska | 656425 |
| Arizona | 114006 |
| Arkansas | 53182 |
| California | 163707 |
然後,我們檢視 abbrevs 資料集的前幾行,發現它包含了州的縮寫和全名:
| state | abbreviation |
|---|---|
| Alabama | AL |
| Alaska | AK |
| Arizona | AZ |
| Arkansas | AR |
| California | CA |
現在,我們想要合併 pop 和 abbrevs 資料集,以便在 pop 中新增州的全名。為此,我們使用 pd.merge() 函式,指定 how='outer' 以確保不丟棄任何資料:
merged = pd.merge(pop, abbrevs, how='outer', left_on='state/region', right_on='abbreviation')
這個合併操作會根據 pop 中的 state/region 欄位和 abbrevs 中的 abbreviation 欄位進行匹配。由於我們使用了 how='outer',所以即使兩個資料集之間沒有完全匹配的資料,也不會丟棄任何一方的資料。
內容解密:
在這裡,我們使用了 pd.merge() 函式來合併兩個資料集。這個函式需要指定以下引數:
left_on:左邊資料集(pop)中要用於合併的欄位名稱。right_on:右邊資料集(abbrevs)中要用於合併的欄位名稱。how:合併的方式,可以是'inner'、'outer'、'left'或'right'。
在這個例子中,我們使用了 how='outer',這意味著我們想要保留兩個資料集中的所有資料,即使它們之間沒有完全匹配的資料。
圖表翻譯:
這個圖表顯示了我們如何合併 pop 和 abbrevs 資料集。兩個資料集都被合併到一個新的資料集中,稱為 Merged。合併的基礎是 pop 中的 state/region 欄位和 abbrevs 中的 abbreviation 欄位。
合併資料與處理遺失值
在進行資料分析時,經常會遇到需要合併不同資料集的情況。以下是如何使用Python的pandas函式庫來合併資料,並處理遺失值的步驟。
合併資料
首先,我們需要合併兩個資料集。假設我們有兩個資料集,分別是df1和df2,我們可以使用merge函式來合併它們。合併的基礎是兩個資料集之間的共同欄位,也就是state/region和abbreviation。
merged = pd.merge(df1, df2, left_on='state/region', right_on='abbreviation')
合併後,我們可以看到有一些重複的資訊,例如abbreviation欄位。為了避免這種情況,我們可以使用drop函式來移除這些重複的資訊。
merged = merged.drop('abbreviation', axis=1)
檢查遺失值
合併資料後,我們需要檢查是否有任何遺失值。可以使用isnull函式來檢查每一欄位是否有遺失值。
print(merged.isnull().any())
如果發現有遺失值,我們可以使用布林索引(Boolean indexing)來找出哪些行有遺失值。
print(merged[merged['population'].isnull()].head())
這樣就可以找到哪些行的population欄位有遺失值。
處理遺失值
找到遺失值後,我們就可以開始處理它們了。根據具體的情況,可以採用不同的方法來處理遺失值,例如填充平均值、填充中位數、或是使用更複雜的模型來預測遺失值。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Pandas資料合併索引欄位合併技巧
package "Pandas 資料處理" {
package "資料結構" {
component [Series
一維陣列] as series
component [DataFrame
二維表格] as df
component [Index
索引] as index
}
package "資料操作" {
component [選取 Selection] as select
component [篩選 Filtering] as filter
component [分組 GroupBy] as group
component [合併 Merge/Join] as merge
}
package "資料轉換" {
component [重塑 Reshape] as reshape
component [透視表 Pivot] as pivot
component [聚合 Aggregation] as agg
}
}
series --> df : 組成
index --> df : 索引
df --> select : loc/iloc
df --> filter : 布林索引
df --> group : 分組運算
group --> agg : 聚合函數
df --> merge : 合併資料
df --> reshape : melt/stack
reshape --> pivot : 重新組織
note right of df
核心資料結構
類似 Excel 表格
end note
@enduml圖表翻譯:
此圖示合併資料、檢查遺失值和處理遺失值的流程。首先,合併兩個資料集,然後檢查每一欄位是否有遺失值。如果發現有遺失值,就可以使用不同的方法來處理它們。最後,完成了資料的預處理,可以進行後續的分析了。
內容解密:
在這個例子中,我們使用了pandas函式庫來合併兩個資料集,然後檢查和處理遺失值。合併資料的基礎是兩個資料集之間的共同欄位,也就是state/region和abbreviation。檢查遺失值時,可以使用isnull函式來檢查每一欄位是否有遺失值。如果發現有遺失值,就可以使用布林索引來找出哪些行有遺失值。最後,根據具體的情況,可以採用不同的方法來處理遺失值。
從技術架構視角來看,利用 Pandas 的 merge 函式進行資料合併,尤其是索引合併,能有效提升資料處理效率。透過 left_index 和 right_index 或 DataFrame.join() 方法,可以簡化程式碼並避免冗餘操作。然而,索引合併的效能取決於索引的型別和資料量,對於極大規模資料集,仍需考量記憶體使用和執行時間。技術團隊應根據資料特性選擇合適的合併策略,例如混合使用索引和欄位合併,並善用 suffixes 引數處理欄位名稱衝突。預期未來 Pandas 將持續最佳化合併演算法,並更好地支援分散式資料處理,以應對日益增長的資料規模和複雜度。對於追求高效能的資料分析專案,建議深入理解不同合併方法的底層機制,並根據實際情況進行效能測試和調校。玄貓認為,掌握索引合併的技巧對於提升資料處理效率至關重要,值得資料科學家和工程師深入研究。