根據索引合併 Pandas DataFrame

  1. 使用 merge() 合併索引上的兩個 Pandas DataFrame
  2. 使用 join() 來合併索引上的兩個 Pandas DataFrame

在資料科學和機器學習的世界裡,必須熟練掌握組織、維護和清理資料以便進一步分析的操作。合併兩個 DataFrames 就是這樣一個操作的例子。事實證明,使用 Python 中的 Pandas 庫很容易合併兩個 DataFrames。

Pandas 為我們提供了兩個有用的函式,merge()join() 來合併兩個 DataFrames。這兩種方法非常相似,但 merge() 被認為更通用、更靈活。它還提供了許多引數來改變最終 DataFrame 的行為。join() 將兩個 DataFrame 合併在它們的索引上,而 merge() 允許我們指定可以作為鍵的列來合併兩個 DataFrame。

這兩個函式的一個共同引數是 how,它定義了連線的型別。預設情況下,how 引數對於 merge() 來說是 inner,對於 join() 來說是 left,但對於這兩個函式來說,它可以被改為 leftrightinnerouter。瞭解它們之間的區別是很有必要的。

在合併兩個 Pandas DataFrames 時,我們假設一個是左 DataFrame,另一個是右 DataFrame。merge()join() 都是對關鍵列的記錄進行匹配。inner 連線返回一個由兩個 DataFrame 中匹配的記錄組成的 DataFrame。outer 連線產生一個合併的 DataFrame,包含兩個 DataFrame 中的所有元素,填充兩邊缺失值的 NaN。left 連線包含左邊 DataFrame 的所有元素,但只包含右邊 DataFrame 的匹配記錄。與 left 相反的是 right,它包含右 DataFrame 的所有元素,只包含左 DataFrame 的匹配記錄。所有這些都將在接下來的示例程式碼中更加清晰,我們將在下面的程式碼中組合 DataFrame。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

print(df1)
print(df2)

輸出:

  C1
1  a
2  b
4  d
5  e
7  h
   C2
1  AA
2  BB
3  CC
5  EE
6  FF

使用 merge() 合併索引上的兩個 Pandas DataFrame

當合並兩個 DataFrames 的索引時,merge() 函式的 left_indexright_index 引數的值應該是 True。下面的程式碼示例將合併兩個 DataFrames,加入型別為 inner

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

df_inner = df1.merge(df2, how='inner', left_index=True, right_index=True)

print(df_inner)

輸出:

  C1  C2
1  a  AA
2  b  BB
5  e  EE

下面的程式碼將合併連線型別為 outer 的 DataFrames。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

df_outer = df1.merge(df2, how='outer', left_index=True, right_index=True)

print(df_outer)

輸出:

    C1   C2
1    a   AA
2    b   BB
3  NaN   CC
4    d  NaN
5    e   EE
6  NaN   FF
7    h  NaN

正如你所看到的,合併後的 DataFrame 的連線型別為 inner,只有來自兩個 DataFrame 的匹配記錄,而連線型別為 outer 的 DataFrame 擁有所有的元素,用 NaN 來填充缺失的記錄。現在使用左連線。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

df_left = df1.merge(df2, how='left', left_index=True, right_index=True)

print(df_left)

輸出:

  C1   C2
1  a   AA
2  b   BB
4  d  NaN
5  e   EE
7  h  NaN

上述合併後的 DataFrame 擁有左側 DataFrame 中的所有元素,只有右邊 DataFrame 中的匹配記錄。與之完全相反的是右連線,如下圖所示。

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

df_right = df1.merge(df2, how='right', left_index=True, right_index=True)

print(df_right)

輸出:

    C1  C2
1    a  AA
2    b  BB
3  NaN  CC
5    e  EE
6  NaN  FF

使用 join() 來合併索引上的兩個 Pandas DataFrame

join() 方法根據兩個 DataFrame 的索引將其合併,預設情況下,連線型別是 left。它總是使用右側 DataFrame 的索引,但我們可以為左側 DataFrame 提鍵。我們可以為 join() 函式指定連線型別,就像我們為 merge() 函式指定的一樣。

下面的例子顯示了合併後的 DataFrame 的 outer 連線型別。

import pandas as pd
import numpy as np
df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])
df_outer = df1.join(df2, how='outer')
print(df_outer)

輸出:

    C1   C2
1    a   AA
2    b   BB
3  NaN   CC
4    d  NaN
5    e   EE
6  NaN   FF
7    h  NaN

相關文章 - Pandas DataFrame

  • 拆分 Pandas DataFrame
  • 將函式應用於 Pandas DataFrame 中的多個列