Pandas 是 Python 資料科學領域的核心函式函式庫,提供高效的資料結構和分析工具。在資料分析流程中,資料探索階段至關重要,它幫助我們理解資料的結構、分佈和特性,為後續分析奠定基礎。本文將介紹一些常用的 Pandas 資料探索技巧,包括資料預覽、篩選、切片和統計分析。利用 head()tail() 函式快速檢視資料集的前後幾行,可以初步瞭解資料的欄位組成和資料型別。sample() 函式則允許我們隨機抽取資料樣本,對於大型資料集尤其有用,可以快速概覽資料的整體分佈。此外,loc[] 函式可以根據索引或條件選取特定資料,方便我們針對特定資料子集進行分析。

程式碼示例

import pandas as pd

# 建立一個示例資料框架
data = {
    'ID': [1, 2, 3, 4, 5],
    'DURATION': ['0:07:03', '0:04:57', '0:01:14', '0:06:58', '0:03:06'],
    # ... 其他欄位
}
df = pd.DataFrame(data)

# 顯示前 10 行
print(df.head(10))

# 設定最大顯示欄位數
pd.set_option('display.max_columns', 500)

# 額外顯示所有欄位
print(df.head())

# 選取單一欄位
print(df['DURATION'])

圖表翻譯:

  flowchart TD
    A[資料框架] --> B[head() 或 tail()]
    B --> C[顯示前/後 n 行]
    C --> D[設定最大顯示欄位數]
    D --> E[顯示所有欄位]
    E --> F[選取單一欄位]
    F --> G[傳回指定欄位的值]

內容解密:

以上程式碼示例展示瞭如何使用 Pandas 的 head()tail() 方法來顯示資料框架的前後幾行,以及如何設定最大顯示欄位數和選取單一欄位。這些方法在資料分析和處理中非常常用。

探索性資料分析

在進行資料分析時,瞭解資料的結構和內容是非常重要的。Python 提供了多種方法來探索資料,包括檢視資料的前幾行、後幾行、特定欄位等。

檢視資料的前幾行和後幾行

使用 head()tail() 方法可以檢視資料的前幾行和後幾行。例如:

import pandas as pd

# 載入資料
df = pd.read_csv('data.csv')

# 檢視資料的前幾行
print(df.head())

# 檢視資料的後幾行
print(df.tail())

這些方法可以幫助您快速瞭解資料的結構和內容。

檢視特定欄位

如果您只想檢視特定欄位的資料,可以使用雙方括號 [][] 來指定欄位名稱。例如:

print(df[['trip_id', 'DURATION', 'start_location_name']])

這會顯示 trip_idDURATIONstart_location_name 欄位的資料。

範例資料

以下是範例資料的前幾行:

   trip_id DURATION start_location_name
0  1613335  0:07:03  1901 Roma Ave NE, Albuquerque, NM 87106, USA
1  1613639  0:04:57  1 Domenici Center en Domenici Center, Albuquer...
2  1613708  0:01:14  1 Domenici Center en Domenici Center, Albuquer...
3  1613867  0:06:58  Rotunda at Science & Technology Park, 801 Univ...
4  1636714  0:03:06  401 2nd St NW, Albuquerque, NM 87102, USA

這些資料顯示了每次旅程的 ID、持續時間和起始位置。

內容解密:

上述程式碼使用了 Pandas 函式庫來載入和操作資料。head()tail() 方法用於檢視資料的前幾行和後幾行,而雙方括號 [][] 用於指定特定欄位的名稱。這些方法可以幫助您快速瞭解資料的結構和內容。

圖表翻譯:

  flowchart TD
    A[載入資料] --> B[檢視前幾行]
    B --> C[檢視後幾行]
    C --> D[檢視特定欄位]
    D --> E[顯示結果]

這個流程圖顯示了探索性資料分析的過程,從載入資料到檢視特定欄位的結果。

資料預覽與抽樣

在進行資料分析之前,瞭解資料的分佈和特性是非常重要的。Python 的 Pandas 函式函式庫提供了 sample() 方法,讓我們可以輕易地從資料中抽取一部分樣本進行預覽。

使用 sample() 方法

sample() 方法允許你指定要抽取的樣本數量。以下是如何使用它的範例:

import pandas as pd

# 假設 df 是你的 DataFrame
df.sample(5)

這個方法會從你的 DataFrame 中隨機抽取 5 筆資料,並傳回一個新的 DataFrame。這對於快速瞭解資料的結構和內容非常有用。

範例輸出

假設我們有一個 DataFrame df,包含了計程車的行程資料,包括月份、行程 ID、使用者 ID 等欄位。使用 sample(5) 方法後,可能會得到以下的輸出:

   month  trip_id ...  user_id  trip_ledger_id
4974   June  1753394 ...  35569540         1624088
18390  June  1992655 ...  42142022         1857395

這個輸出顯示了抽取的 5 筆資料(實際上可能不止 5 筆,因為範例中只顯示了兩筆),包括月份、行程 ID、使用者 ID 和行程帳本 ID 等欄位。

自訂抽樣

你也可以根據特定的條件進行抽樣,例如抽取某個月份的所有資料,或者是抽取特定使用者的資料。這需要結合其他 Pandas 方法,例如 loc[]query(),來過濾資料後再進行抽樣。

資料切片與索引

在資料分析中,切片和索引是兩個非常重要的概念。切片允許您從資料中提取特定的行或列,而索引則提供了一種方式來存取和操作資料中的特定元素。

切片

切片的格式通常為 [start:end],其中 startend 分別代表切片的起始和結束索引。如果省略 start,則切片將從資料的開頭開始;如果省略 end,則切片將一直到資料的結尾。

例如,若要切片第一行到第十行的資料,可以使用 df[:10]。這將傳回一個新的資料框,包含原始資料框的前十行。

索引

索引是資料中每一行的唯一識別符號。索引可以是整數、字串或其他型別的值。當您建立一個資料框時,索引通常是自動分配的,從 0 開始並遞增 1。

但是,索引不一定是連續的。在某些情況下,索引可能會跳躍或不連續。這可能是因為資料是從多個來源合併而來,或者是因為某些行已經被刪除。

範例

假設我們有一個資料框 df,其中包含一些旅行記錄。資料框的索引不是連續的,因為這是一個樣本。

import pandas as pd

# 建立一個樣本資料框
data = {
    'month': ['May', 'May', 'June'],
    'trip_id': [1613335, 1613639, 2066449],
    'user_id': [8417864, 8417864, 35466666],
    'trip_ledger_id': [1488546, 1488838, 1929987]
}
df = pd.DataFrame(data, index=[0, 1, 21761])

print(df)

輸出:

         month  trip_id   user_id  trip_ledger_id
0         May  1613335  8417864           1488546
1         May  1613639  8417864           1488838
21761     June  2066449  35466666          1929987

在這個範例中,索引不是連續的,因為我們在建立資料框時指定了索引值。這可能是因為資料是從多個來源合併而來,或者是因為某些行已經被刪除。

切片資料

現在,讓我們切片這個資料框,提取前三行的資料。

print(df[:3])

輸出:

         month  trip_id   user_id  trip_ledger_id
0         May  1613335  8417864           1488546
1         May  1613639  8417864           1488838
21761     June  2066449  35466666          1929987

在這個範例中,切片 df[:3] 傳回了前三行的資料,包括索引為 0、1 和 21761 的行。

資料框選擇

在進行資料分析時,選擇特定資料行或列是非常重要的。以下是幾種選擇資料的方法:

切片選擇

您可以使用切片的方式選擇資料框中的特定行。例如,要選擇從第10行到最後一行的資料,可以使用以下語法:

df[10:]

這會傳回從第10行到最後一行的所有資料。

指定行範圍

您也可以指定一個行範圍來選擇資料。例如,要選擇從第3行到第9行的資料,可以使用以下語法:

df[3:9]

這會傳回從第3行到第9行的所有資料。

使用loc()方法

如果您知道要選擇的行的索引名稱,您可以使用loc()方法來選擇特定行。例如,要選擇索引為34221的行,可以使用以下語法:

df.loc[34221]

這會傳回索引為34221的行的資料。

範例

以下是使用loc()方法選擇特定行的範例:

import pandas as pd

# 建立一個資料框
data = {'month': ['May', 'May', 'May', 'May', 'May', 'May'],
        'trip_id': [1613867, 1636714, 1636780, 1636856, 1636912, 1637035],
        'user_id': [8417864, 35436274, 34352757, 35466666, 34352757, 35466666],
        'trip_ledger_id': [1489064, 1511212, 1511371, 1511483, 1511390, 1511516]}
df = pd.DataFrame(data)

# 使用loc()方法選擇特定行
print(df.loc[3])

這會輸出:

month           May
trip_id     1636856
user_id    35466666
trip_ledger_id  1511483
Name: 3, dtype: object

圖表翻譯:

  flowchart TD
    A[資料框] --> B[選擇行]
    B --> C[使用切片]
    C --> D[使用loc()方法]
    D --> E[傳回選擇的行]

這個圖表顯示了選擇資料框中的特定行的流程。首先,建立一個資料框,然後選擇要傳回的行。可以使用切片或loc()方法來選擇行。最終,傳回選擇的行的資料。

使用Pandas進行資料選取和篩選

在使用Pandas進行資料分析時,選取和篩選資料是非常重要的步驟。以下是如何使用Pandas進行資料選取和篩選的範例。

使用at()和loc()進行資料選取

您可以使用at()和loc()方法來選取DataFrame中的特定資料。at()方法可以用來選取單一值,loc()方法可以用來選取多個值。

import pandas as pd

# 建立一個DataFrame
data = {
    'region_id': [202],
    'vehicle_id': [2893981],
    'started_at': ['7/21/2019 23:51'],
    'ended_at': ['7/22/2019 0:05'],
    'DURATION': ['0:14:00'],
    'start_location_name': ['Central @ Broadway, Albuquerque, NM 87102, USA'],
    'end_location_name': ['1418 4th St NW, Albuquerque, NM 87102, USA'],
    'user_id': [42559731],
    'trip_ledger_id': [2340035]
}
df = pd.DataFrame(data)

# 使用at()選取單一值
print(df.at[0, 'DURATION'])  # 輸出: '0:14:00'

# 使用loc()選取多個值
print(df.loc[0, 'DURATION'])  # 輸出: '0:14:00'

使用where()方法進行資料篩選

您可以使用where()方法來篩選DataFrame中的資料。where()方法可以用來篩選符合特定條件的資料。

# 建立一個DataFrame
data = {
    'month': ['May', 'May'],
    'trip_id': [1613335.0, 1613639.0],
    'user_id': [8417864.0, 8417864.0],
    'trip_ledger_id': [1488546.0, 1488838.0]
}
df = pd.DataFrame(data)

# 使用where()方法篩選資料
user = df.where(df['user_id'] == 8417864.0)
print(user)

使用條件篩選資料

您可以使用條件來篩選DataFrame中的資料。例如,您可以使用以下程式碼來篩選user_id為8417864.0的資料。

# 篩選user_id為8417864.0的資料
user = df[df['user_id'] == 8417864.0]
print(user)

這些方法可以用來選取和篩選DataFrame中的資料,從而進行進一步的資料分析。

資料清理、轉換和增強

在資料分析中,資料清理、轉換和增強是非常重要的步驟。這些步驟可以幫助我們去除不需要的資料,轉換資料格式,和增加新的資料欄位,以便更好地分析資料。

條件篩選

條件篩選是資料清理中的一個重要步驟。它可以幫助我們篩選出符合特定條件的資料。例如,我們可以使用 where() 函式來篩選出 user_id 等於 8417864 的資料。

df.where(df['user_id'] == 8417864)

這個函式會將不符合條件的資料替換為 NaN。或者,我們可以使用另一個語法來達到相同的效果。

df[(df['user_id'] == 8417864)]

這個語法會直接傳回符合條件的資料,不會包含 NaN 值。

條件組合

我們也可以組合多個條件來篩選資料。例如,我們可以新增一個 trip_id 的條件。

one = df['user_id'] == 8417864
two = df['trip_ledger_id'] == 1488838
df[(one) & (two)]

這個例子會傳回同時符合 user_idtrip_id 條件的資料。

資料轉換

除了條件篩選,資料轉換也是資料清理中的一個重要步驟。它可以幫助我們將資料從一個格式轉換到另一個格式。例如,我們可以使用 astype() 函式來將資料欄位的型別轉換為數字型別。

df['column_name'] = df['column_name'].astype(int)

資料增強

資料增強是指增加新的資料欄位或計算新的值。例如,我們可以使用 apply() 函式來計算每一行的總值。

df['total'] = df.apply(lambda row: row['value1'] + row['value2'], axis=1)

這個例子會增加一個新的 total 欄位,包含每一行的總值。

圖表翻譯:

  graph LR
    A[資料清理] --> B[條件篩選]
    B --> C[資料轉換]
    C --> D[資料增強]
    D --> E[資料分析]

圖表解釋:

上述流程圖展示了資料清理、轉換和增強的流程。首先,我們進行資料清理,然後進行條件篩選,接下來是資料轉換,最後是資料增強。這個流程可以幫助我們得到乾淨、完整和準確的資料,以便進行進一步的分析。

探索性資料分析

在進行資料分析時,瞭解資料的結構和內容是非常重要的。以下是使用 Python 進行探索性資料分析的範例。

篩選資料

首先,我們可以使用 where 函式來篩選資料。假設我們有兩個條件 onetwo,我們可以使用以下程式碼來篩選資料:

df.where(one & two)

這會回傳一個新的資料框,包含符合兩個條件的資料。

使用第二種標記法

另外,我們也可以使用第二種標記法來篩選資料:

df[(one)&(two)]

這會產生相同的結果。

分析資料

現在我們已經篩選了資料,下一步就是分析資料。使用 describe 函式可以產生一系列的統計資料,包括平均值、標準差、最小值、最大值等:

df.describe()

這會產生一個包含各種統計資料的資料框,包括五數摘要(five-number summary)。

統計資料

五數摘要是一組統計資料,包括最小值、第一四分位數(Q1)、中位數、第三四分位數(Q3)和最大值。使用 describe 函式可以快速產生這些資料。

範例輸出

以下是使用 describe 函式的範例輸出:

          trip_id  region_id  vehicle_id  user_id
count  1.000000  1.000000  1.000000  1.000000
mean   1613639.0  NaN        NaN        8417864.0
std    NaN        NaN        NaN        NaN
min    1613639.0  NaN        NaN        8417864.0
25%    NaN        NaN        NaN        NaN
50%    NaN        NaN        NaN        NaN
75%    NaN        NaN        NaN        NaN
max    1613639.0  NaN        NaN        8417864.0

這個輸出包含了各種統計資料,包括平均值、標準差、最小值、最大值等。

內容解密:

在這個範例中,我們使用 describe 函式來產生一系列的統計資料。這些資料可以幫助我們瞭解資料的結構和內容。透過分析這些資料,我們可以更好地瞭解資料的特點和趨勢。

圖表翻譯:

以下是使用 Mermaid 生成的圖表,展示了資料的分佈情況:

  flowchart TD
    A[資料] --> B[篩選]
    B --> C[分析]
    C --> D[統計資料]
    D --> E[五數摘要]
    E --> F[平均值]
    E --> G[標準差]
    E --> H[最小值]
    E --> I[最大值]

這個圖表展示了資料分析的流程,從篩選資料到產生統計資料。

統計分析報告

資料概覽

本報告根據一份包含 34,226 筆記錄的資料集,進行了統計分析。分析結果如下:

  • 計數(count):34,226
  • 平均值(mean):1,869,549
  • 標準差(std):225,263.9
  • 最小值(min):1,488,546
  • 最大值(max):2,482,335

分位數分析

分位數分析結果如下:

  • 25% 分位數:1,683,023
  • 50% 分位數:1,827,796
  • 75% 分位數:2,042,524

程式碼實作

以下是使用 Python 進行統計分析的程式碼實作:

import pandas as pd
import numpy as np

# 載入資料
data = pd.read_csv('data.csv')

# 計算統計量
count = data.shape[0]
mean = data['trip_ledger_id'].mean()
std = data['trip_ledger_id'].std()
min_val = data['trip_ledger_id'].min()
max_val = data['trip_ledger_id'].max()

# 計算分位數
q25 = np.percentile(data['trip_ledger_id'], 25)
q50 = np.percentile(data['trip_ledger_id'], 50)
q75 = np.percentile(data['trip_ledger_id'], 75)

# 輸出結果
print(f'計數:{count}')
print(f'平均值:{mean}')
print(f'標準差:{std}')
print(f'最小值:{min_val}')
print(f'最大值:{max_val}')
print(f'25% 分位數:{q25}')
print(f'50% 分位數:{q50}')
print(f'75% 分位數:{q75}')

內容解密:

  • pandas 函式函式庫用於資料操作和分析。
  • numpy 函式函式庫用於數值計算。
  • read_csv 函式用於載入 CSV 格式的資料。
  • shape 屬性用於取得資料的形狀。
  • mean 函式用於計算平均值。
  • std 函式用於計算標準差。
  • min 函式用於計算最小值。
  • max 函式用於計算最大值。
  • np.percentile 函式用於計算分位數。

圖表翻譯:

以下是使用 Mermaid 語法繪製的統計分析結果圖表:

  flowchart TD
    A[資料載入] --> B[統計量計算]
    B --> C[分位數計算]
    C --> D[結果輸出]
    D --> E[圖表繪製]

圖表翻譯:

  • 圖表描述了統計分析的流程。
  • 資料載入 步驟負責載入資料。
  • 統計量計算 步驟負責計算統計量。
  • 分位數計算 步驟負責計算分位數。
  • 結果輸出 步驟負責輸出結果。
  • 圖表繪製 步驟負責繪製圖表。

資料描述與統計分析

在資料探索的過程中,瞭解資料的分佈和特性是非常重要的。描述性統計(descriptive statistics)是一種用於描述和總結資料的方法。其中,describe()方法是 pandas 中的一個強大工具,能夠提供資料的基本統計資訊,包括計數、平均值、標準差、最小值、最大值等。

然而,describe()方法在非數值資料上可能不是很有用。例如,如果你正在處理年齡資料,describe()方法可以快速顯示年齡的分佈,並幫助你發現錯誤的資料,如負數年齡或過多的100歲以上的年齡。但是,如果資料是非數值型的,describe()方法就不太有用了。

單列描述

在某些情況下,對單個列進行描述可能更有用。例如,讓我們看看start_location_name列的描述:

df['start_location_name'].describe()

結果如下:

  • count: 34220
  • unique: 2972
  • top: 1898 Mountain Rd NW, Albuquerque, NM 87104, USA
  • freq: 1210

從這些統計資料中,我們可以看到,有34220個起始位置,但只有2972個唯一的位置。最常見的位置(1898 Mountain Rd NW)佔了1210個起始位置。這些資訊對於後續的資料處理和分析是非常有用的。

值計數

另一個用於檢視資料細節的方法是value_counts()。這個方法可以給出每個唯一值的值和計數。同樣,需要對單個列呼叫這個方法:

df['DURATION'].value_counts()

結果如下:

  • 0:04:00: 825
  • 0:03:00: 807
  • 0:05:00: 728
  • 0:06:00: 649
  • 0:07:00: 627

從這個結果中,我們可以看到0:04:00的頻率最高,達到825次。你也可以看到所有其他值的頻率。要以百分比形式檢影片率,可以傳遞normalize=True引數給value_counts()方法。

探索性資料分析

在進行資料分析時,瞭解資料的分佈和特性是非常重要的。Python 的 Pandas 函式函式庫提供了 value_counts() 方法,可以用來計算每個唯一值在資料中的出現次數。

從使用者經驗視角來看,Pandas 提供的 head()tail()sample()、切片、索引、loc[]at[]where()describe()value_counts() 等方法,顯著降低了資料探索和分析的門檻。這些方法允許使用者快速瀏覽資料、抽取樣本、選取特定資料子集、進行條件篩選,並獲得描述性統計資訊,從而有效地理解資料的結構、分佈和特性。然而,這些方法也存在一些限制,例如 describe() 方法對於非數值型資料的分析能力有限,value_counts() 方法在處理大量唯一值時可能產生過於冗長的輸出。對於重視資料探索效率的分析人員而言,熟練掌握這些方法並結合視覺化工具,將能更有效地洞察資料背後的價值。未來,Pandas 發展方向將持續聚焦於提升資料處理效能和擴充套件資料分析功能,以滿足日益增長的資料規模和複雜分析需求。對於資料分析人員來說,持續學習並掌握 Pandas 的最新功能將是保持競爭力的關鍵。