Python Pandas - 資料連線



Pandas 中的資料連線是指沿著指定軸連線兩個或多個 Pandas 物件(如 DataFrame 或 Series)的過程。當需要合併來自不同來源或資料集的資料時,此操作非常有用。

此操作的主要工具是 **pd.concat()** 函式,它可用於 **Series**、**DataFrame** 物件,無論您是組合行還是列。Pandas 中的資料連線涉及按行或按列組合多個 DataFrame 或 Series 物件。

在本教程中,我們將探討如何使用 **pd.concat()** 函式連線 Pandas 物件。我們將討論不同的場景,包括沿行連線、使用鍵區分連線的 DataFrame、在連線期間忽略索引以及沿列連線。

理解 pd.concat() 函式

**pandas.concat()** 函式是 Pandas 中用於連線的主要方法。它允許您沿著特定軸連線 pandas 物件,並提供各種用於處理索引的選項。

**pd.concat()** 函式的語法如下:

pandas.concat(objs, *, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=None)

其中:

  • **objs:** 這是 Series、DataFrame 或 Panel 物件的序列或對映。

  • **axis:** {0, 1, ...}, 預設值為 0。這是要沿其連線的軸。

  • **join:** {"inner", "outer"}, 預設值為 "outer"。如何處理其他軸上的索引。 "outer" 表示並集,"inner" 表示交集。

  • **ignore_index:** 布林值,預設為 False。如果為 True,則不使用連線軸上的索引值。結果軸將標記為 0, ..., n - 1。

  • **keys:** 用於沿連線軸建立分層索引。

  • **levels:** 結果中多層索引要使用的特定層級。

  • **names:** 結果分層索引中層級的名稱。

  • **verify_integrity:** 如果為 True,則檢查新軸中是否存在重複項,如果發現重複項則引發錯誤。

  • **sort:** 當組合列未對齊的 DataFrame 時,此引數確保列已排序。

  • **copy:** 預設值為 None。如果為 False,則不必要地複製資料。

**concat()** 函式完成了沿軸執行連線操作的所有繁重工作。讓我們建立不同的物件並進行連線。

示例:連線 DataFrame

在此示例中,兩個 DataFrame 沿行連線,生成的 DataFrame 具有重複的索引。

import pandas as pd

# Creating two DataFrames
one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])

# Concatenating DataFrames
result = pd.concat([one, two])
print(result)

其**輸出**如下:

     Name subject_id  Marks_scored
1    Alex       sub1            98
2     Amy       sub2            90
3   Allen       sub4            87
4   Alice       sub6            69
5  Ayoung       sub5            78
1   Billy       sub2            89
2   Brian       sub4            80
3    Bran       sub3            79
4   Bryce       sub6            97
5   Betty       sub5            88

示例:使用鍵進行連線

如果要區分連線的 DataFrame,可以使用 keys 引數將特定鍵與 DataFrame 的每個部分關聯。

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print(pd.concat([one,two],keys=['x','y']))

其**輸出**如下:

       Name subject_id  Marks_scored
x 1    Alex       sub1            98
  2     Amy       sub2            90
  3   Allen       sub4            87
  4   Alice       sub6            69
  5  Ayoung       sub5            78
y 1   Billy       sub2            89
  2   Brian       sub4            80
  3    Bran       sub3            79
  4   Bryce       sub6            97
  5   Betty       sub5            88

此處,x 和 y 鍵建立了一個分層索引,可以輕鬆識別每行來自哪個原始 DataFrame。

示例:在連線期間忽略索引

如果結果物件必須遵循其自身的索引,請將 **ignore_index** 設定為 **True**。

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print(pd.concat([one,two],keys=['x','y'],ignore_index=True))

其**輸出**如下:

     Name subject_id  Marks_scored
0    Alex       sub1            98
1     Amy       sub2            90
2   Allen       sub4            87
3   Alice       sub6            69
4  Ayoung       sub5            78
5   Billy       sub2            89
6   Brian       sub4            80
7    Bran       sub3            79
8   Bryce       sub6            97
9   Betty       sub5            88

注意,索引完全改變了,鍵也被覆蓋了。

示例:沿列連線

您可以透過將 **axis** 引數設定為 1 來沿列連線,而不是沿行連線。

import pandas as pd

one = pd.DataFrame({
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5'],
   'Marks_scored':[98,90,87,69,78]},
   index=[1,2,3,4,5])

two = pd.DataFrame({
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5'],
   'Marks_scored':[89,80,79,97,88]},
   index=[1,2,3,4,5])
print(pd.concat([one,two],axis=1))

其**輸出**如下:

    Name subject_id  Marks_scored   Name subject_id  Marks_scored
1    Alex       sub1            98  Billy       sub2            89
2     Amy       sub2            90  Brian       sub4            80
3   Allen       sub4            87   Bran       sub3            79
4   Alice       sub6            69  Bryce       sub6            97
5  Ayoung       sub5            78  Betty       sub5            88
廣告