Python Pandas - 資料索引和選擇



在 pandas 中,資料索引和選擇對於高效處理 Series 和 DataFrame 物件中的資料至關重要。這些操作可以幫助您輕鬆地切片、切塊和訪問資料的子集。

這些操作涉及檢索資料結構(無論是 Series 還是 DataFrame)的特定部分。此過程對於資料分析至關重要,因為它允許您專注於相關資料、應用轉換和執行計算。

pandas 中的索引至關重要,因為它提供了有助於分析、視覺化和互動式顯示的元資料。它自動對齊資料以簡化操作,並簡化獲取和設定資料子集的過程。

本教程將探討使用 Pandas 切片、切塊和操作資料的各種方法,幫助您瞭解如何訪問和修改資料的子集。

Pandas 中的索引型別

與 Python 和 NumPy 的索引([ ])和屬性(.)運算子類似,Pandas 提供了直接訪問其資料結構中資料的方法。但是,由於被訪問的資料型別可能無法預測,因此僅依賴這些標準運算子可能會導致最佳化方面的挑戰。

Pandas 提供了幾種用於索引和選擇資料的方法,例如:

  • 使用 .loc 進行基於標籤的索引

  • 使用 .iloc 進行基於整數位置的索引

  • 使用方括號 [] 進行索引

使用 .loc 進行基於標籤的索引

.loc 索引器用於基於標籤的索引,這意味著您可以按其標籤訪問行和列。它還支援布林陣列進行條件選擇。

.loc() 有多種訪問方法,例如:

  • 單個標量標籤:選擇單行或單列,例如:df.loc['a']。

  • 標籤列表:選擇多行或多列,例如:df.loc[['a', 'b']]。

  • 標籤切片:使用標籤進行切片,例如:df.loc['a':'f'](起始和結束都包含)。

  • 布林陣列:基於條件過濾資料,例如:df.loc[boolean_array]。

loc 使用兩個單值/列表/範圍運算子,用 ',' 分隔。第一個表示行,第二個表示列。

示例 1

這是一個基本示例,它使用 loc 索引器為特定列選擇所有行。

#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

print("Original DataFrame:\n", df)

#select all rows for a specific column
print('\nResult:\n',df.loc[:,'A'])

輸出如下:

Original DataFrame:
           A         B         C         D
a  0.962766 -0.195444  1.729083 -0.701897
b -0.552681  0.797465 -1.635212 -0.624931
c  0.581866 -0.404623 -2.124927 -0.190193
d -0.284274  0.019995 -0.589465  0.914940
e  0.697209 -0.629572 -0.347832  0.272185
f -0.181442 -0.000983  2.889981  0.104957
g  1.195847 -1.358104  0.110449 -0.341744
h -0.121682  0.744557  0.083820  0.355442

Result:
 a    0.962766
b   -0.552681
c    0.581866
d   -0.284274
e    0.697209
f   -0.181442
g    1.195847
h   -0.121682
Name: A, dtype: float64

注意:生成的輸出在每次執行時都會有所不同,因為 DataFrame 是使用 NumPy 的隨機數生成器建立的。

示例 2

此示例選擇多列的所有行。

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

# Select all rows for multiple columns, say list[]
print(df.loc[:,['A','C']])

輸出如下:

            A           C
a    0.391548    0.745623
b   -0.070649    1.620406
c   -0.317212    1.448365
d   -2.162406   -0.873557
e    2.202797    0.528067
f    0.613709    0.286414
g    1.050559    0.216526
h    1.122680   -1.621420

示例 3

此示例選擇特定列的特定行。

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

# Select few rows for multiple columns, say list[]
print(df.loc[['a','b','f','h'],['A','C']])

輸出如下:

           A          C
a   0.391548   0.745623
b  -0.070649   1.620406
f   0.613709   0.286414
h   1.122680  -1.621420

示例 4

以下示例使用 loc 索引器選擇所有列的一系列行。

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])

# Select range of rows for all columns
print(df.loc['c':'e'])

輸出如下:

          A         B         C         D
c  0.044589  1.966278  0.894157  1.798397
d  0.451744  0.233724 -0.412644 -2.185069
e -0.865967 -1.090676 -0.931936  0.214358

使用 .iloc 進行基於整數位置的索引

.iloc 索引器用於基於整數的索引,允許您按其數值位置選擇行和列。此方法類似於標準 Python 和 NumPy 索引(即基於 0 的索引)。

  • 單個整數:按其位置選擇資料,例如:df.iloc[0]。

  • 整數列表:按其位置選擇多行或多列,例如:df.iloc[[0, 1, 2]]。

  • 整數切片:使用整數進行切片,例如:df.iloc[1:3]。

  • 布林陣列:與 .loc 類似,但用於位置。

示例 1

這是一個基本示例,它使用 iloc 索引器為所有列選擇 4 行。

# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

print("Original DataFrame:\n", df)

# select all rows for a specific column
print('\nResult:\n',df.iloc[:4])

輸出如下:

Original DataFrame:
           A         B         C         D
0 -1.152267  2.206954 -0.603874  1.275639
1 -0.799114 -0.214075  0.283186  0.030256
2 -1.823776  1.109537  1.512704  0.831070
3 -0.788280  0.961695 -0.127322 -0.597121
4  0.764930 -1.310503  0.108259 -0.600038
5 -1.683649 -0.602324 -1.175043 -0.343795
6  0.323984 -2.314158  0.098935  0.065528
7  0.109998 -0.259021 -0.429467  0.224148

Result:
           A         B         C         D
0 -1.152267  2.206954 -0.603874  1.275639
1 -0.799114 -0.214075  0.283186  0.030256
2 -1.823776  1.109537  1.512704  0.831070
3 -0.788280  0.961695 -0.127322 -0.597121

示例 2

以下示例使用整數切片選擇特定資料。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# Integer slicing
print(df.iloc[:4])
print(df.iloc[1:5, 2:4])

輸出如下:

           A          B           C           D
0   0.699435   0.256239   -1.270702   -0.645195
1  -0.685354   0.890791   -0.813012    0.631615
2  -0.783192  -0.531378    0.025070    0.230806
3   0.539042  -1.284314    0.826977   -0.026251

           C          D
1  -0.813012   0.631615
2   0.025070   0.230806
3   0.826977  -0.026251
4   1.423332   1.130568

示例 3

此示例使用值列表透過切片選擇資料。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# Slicing through list of values
print(df.iloc[[1, 3, 5], [1, 3]])

輸出如下:

           B           D
1   0.890791    0.631615
3  -1.284314   -0.026251
5  -0.512888   -0.518930

使用方括號“[]”進行直接索引

使用 [] 進行直接索引是一種快速而直觀的資料訪問方式,類似於使用 Python 字典和 NumPy 陣列進行索引。它通常用於基本操作:

  • 單列:按名稱訪問單列。

  • 多列:透過傳遞列名列表來選擇多列。

  • 行切片:使用基於整數的索引切片行。

示例 1

此示例演示如何使用方括號進行直接索引來訪問單列。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# Accessing a Single Column
print(df['A'])

輸出如下:

0   -0.850937
1   -1.588211
2   -1.125260
3    2.608681
4   -0.156749
5    0.154958
6    0.396192
7   -0.397918
Name: A, dtype: float64

示例 2

此示例使用直接索引選擇多列。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# Accessing Multiple Columns
print(df[['A', 'B']])

輸出如下:

          A         B
0  0.167211 -0.080335
1 -0.104173  1.352168
2 -0.979755 -0.869028
3  0.168335 -1.362229
4 -1.372569  0.360735
5  0.428583 -0.203561
6 -0.119982  1.228681
7 -1.645357  0.331438
廣告