使用pandas進行資料分析

写代码的大学生發表於2024-10-27

目錄
  • 1.pandas的特點
  • 2.Series
    • 2.1新建Seriws
    • 2.2使用標籤來選擇資料
    • 2.3 透過指定位置選擇資料
    • 2.4 使用布林值選擇資料
    • 2.5 其他操作
      • 2.5.1 修改資料
      • 2.5.2 統計操作
      • 2.5.3 缺失資料處理
  • 3.DataFrame
    • 3.1 新建 DataFrame
    • 3.2 選擇資料
      • 3.2.1 使用標籤選擇資料
      • 3.2.2 使用 iloc 選擇資料
      • 3.2.3 使用指定列名選擇資料
      • 3.2.4 使用布林值選擇資料
    • 3.3 修改資料
    • 3.4 統計操作
    • 3.5 處理缺失資料
  • 4.讀取格式各樣的資料
    • 4.1 讀取 CSV 格式檔案
    • 4.2 讀取 Excel 檔案
    • 4.3 讀取 SQL 檔案
    • 4.4 讀取 HTML 檔案
  • 5.資料預處理
    • 5.1 使用布林值篩選資料
    • 5.2 使用 where 方法篩選資料
    • 5.3 修改資料
    • 5.4 缺失值處理
    • 5.5 排序
  • 6.統計計算
    • 6.1 常見的統計函式
        • 描述性統計
        • 分佈和形狀
        • 相關性
        • 自定義統計
    • 6.2 快速統計彙總
  • 7.交叉統計
    • 7.1 使用 groupby() 統計
    • 7.2 使用 pivot_table() 統計
  • 8.時間序列的資料處理
    • 8.1 使用時間序列資料的函式
    • 8.2 DatetimeIndex
    • 8.3 篩選時間序列資料
    • 8.4 取樣

pandas是具有非常直觀且容易操作的索引資料的python第三方軟體包。pandas主要有兩種資料結構,分別是Series和DataFrame,其廣泛用於金融、統計、社會科學等領域的資料分析工作。

1.pandas的特點

  1. 資料結構
    • DataFrame:類似於 Excel 表格,可以儲存不同型別的資料列。
    • Series:一維陣列,可以儲存任何資料型別(整數、字串、浮點數、Python 物件等)。
  2. 資料操作
    • 支援大量的資料操作,包括資料清洗、處理缺失資料、重取樣時間序列資料等。
    • 提供了豐富的資料對齊和整合處理功能。
  3. 資料索引
    • 支援多種索引方式,包括時間戳、整數索引、標籤索引等。
    • 可以對資料進行高效的切片、篩選和分組。
  4. 時間序列功能
    • 強大的時間序列功能,可以輕鬆處理和分析時間序列資料。
  5. 資料合併
    • 提供了多種資料合併和連線工具,如 mergejoinconcat
  6. 資料分組
    • 透過 groupby 功能,可以對資料進行分組,並應用聚合函式。
  7. 資料重塑
    • 支援 pivotmelt 等操作,可以輕鬆地重塑資料結構。
  8. 處理大資料
    • 雖然 Pandas 不是為處理大規模資料集而設計的,但它可以與 Dask 等庫結合使用,以處理超出記憶體限制的大型資料集。
  9. 整合性
    • 可以與 NumPy、SciPy、Matplotlib、Scikit-learn 等其他 Python 資料科學庫無縫整合。
  10. 效能
    • 底層使用 Cython 和 C 語言編寫,提供了快速的資料操作效能。
  11. 易用性
    • 提供了直觀的 API,使得資料操作和分析變得簡單直觀。
  12. 文件和社群
    • 擁有詳細的官方文件和活躍的社群,使用者可以輕鬆找到幫助和資源。

2.Series

在 Pandas 庫中,Series 是一種一維陣列結構,可以儲存任何資料型別(整數、字串、浮點數、Python 物件等)。它類似於 Python 中的列表(list)或 NumPy 的一維陣列,但 Series 更加強大,因為它可以儲存不同的資料型別,並且每個元素都有一個標籤(稱為索引)。

2.1新建Seriws

可以使用pandas.Series類來新建Series,第一個引數可以帶入(列表、元組、字典、numpy.ndarry)等資料。

ser = pd.Series([1,2,3,4,5],index=list('abcde'))  
ser

如果省略index的話會預設從0開始建立索引

pd.Series([1,2,3,4,5])

2.2使用標籤來選擇資料

使用loc方法可以根據標籤來選擇資料

#指定標籤  
print(ser.loc['b'])  
  
#不使用loc  
print(ser['b'])  
  
#指定標籤範圍  
print(ser.loc['a':'c'])

你已經很好地概述了 Pandas 中 Series 的建立和基本訪問方法。下面我將補充一些細節和額外的操作,以幫助你更好地理解 Series 的使用。

2.3 透過指定位置選擇資料

在 Pandas 中,除了使用標籤(索引)來選擇資料外,還可以透過位置(整數索引)來選擇資料。這與 Python 列表的索引類似。以下是一些示例:

import pandas as pd

# 建立 Series
ser = pd.Series([1, 2, 3, 4, 5], index=list('abcde'))

# 使用位置選擇第一個元素
print(ser.iloc[0])  # 輸出: 1

# 使用位置選擇多個元素
print(ser.iloc[0:3])  # 輸出: a    1, b    2, c    3

# 使用位置選擇最後一個元素
print(ser.iloc[-1])  # 輸出: 5

2.4 使用布林值選擇資料

布林索引是 Pandas 中非常強大的一個功能,它允許你根據條件選擇資料。以下是一些示例:

import pandas as pd

# 建立 Series
ser = pd.Series([1, 2, 3, 4, 5], index=list('abcde'))

# 使用布林索引選擇大於2的元素
print(ser[ser > 2])

# 使用布林索引選擇小於等於3的元素
print(ser[ser <= 3])

2.5 其他操作

2.5.1 修改資料

你可以直接透過索引來修改 Series 中的資料:

ser['a'] = 10  # 修改索引為 'a' 的元素
print(ser)

2.5.2 統計操作

Series 提供了許多內建的統計方法,如 sum(), mean(), max(), min(), std(), var() 等:

print(ser.sum())  # 求和
print(ser.mean())  # 求平均值
print(ser.max())  # 求最大值
print(ser.min())  # 求最小值
print(ser.std())  # 標準差
print(ser.var())  # 方差

2.5.3 缺失資料處理

如果 Series 中包含缺失值(NaN),Pandas 提供了多種處理方法,如 dropna(), fillna() 等:

ser = pd.Series([1, 2, None, 4, 5])
print(ser.dropna())  # 刪除缺失值

ser.fillna(0, inplace=True)  # 將缺失值填充為0
print(ser)

這些操作使得 Series 成為一個非常靈活和強大的資料結構,適用於各種資料分析任務。

3.DataFrame

DataFrame 是 Pandas 中的另一個核心資料結構,它是一個二維表格型資料結構,可以被看作是由多個 Series 組成的(每個 Series 作為 DataFrame 的一列),所有 Series 共享一個索引。

3.1 新建 DataFrame

DataFrame 可以透過多種方式建立,例如從字典、列表、NumPy 陣列、已有的 DataFrame 或者直接從資料檔案(如 CSV)中讀取。

import pandas as pd

# 從字典建立 DataFrame
data = {'Name': ['John', 'Anna', 'Peter', 'Linda'],
        'Age': [28, 23, 34, 29],
        'City': ['New York', 'Paris', 'Berlin', 'London']}
df = pd.DataFrame(data)
print(df)

# 從列表建立 DataFrame
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
df = pd.DataFrame(data, columns=['A', 'B', 'C'])
print(df)

# 從 NumPy 陣列建立 DataFrame
import numpy as np
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
df = pd.DataFrame(data, columns=['A', 'B', 'C'])
print(df)

3.2 選擇資料

3.2.1 使用標籤選擇資料

使用 .loc 可以基於標籤選擇資料。它允許你選擇行和列。

# 選擇行標籤為 'John' 的行
print(df.loc[df['Name'] == 'John'])

# 選擇列 'Age' 和 'City'
print(df.loc[:, ['Age', 'City']])

3.2.2 使用 iloc 選擇資料

使用 .iloc 可以基於整數位置選擇資料。它允許你選擇行和列。

# 選擇第一行
print(df.iloc[0])

# 選擇前兩行和前兩列
print(df.iloc[:2, :2])

3.2.3 使用指定列名選擇資料

直接使用列名可以快速選擇列。

# 選擇 'Age' 列
print(df['Age'])

3.2.4 使用布林值選擇資料

布林索引允許你根據條件選擇行。

# 選擇 'Age' 大於 25 的行
print(df[df['Age'] > 25])

3.3 修改資料

修改 DataFrame 中的資料與 Series 類似,可以直接透過標籤或位置進行修改。

# 修改 'John' 的 'City' 為 'Los Angeles'
df.loc[df['Name'] == 'John', 'City'] = 'Los Angeles'
print(df)

3.4 統計操作

DataFrame 提供了豐富的統計方法,可以對整個資料框或特定的列進行操作。

# 計算每列的描述性統計
print(df.describe())

# 計算 'Age' 列的平均值
print(df['Age'].mean())

3.5 處理缺失資料

Series 類似,DataFrame 也支援多種處理缺失資料的方法。

# 新增缺失值
df.loc[3, 'Age'] = None

# 刪除包含缺失值的行
print(df.dropna())

# 填充缺失值
df.fillna(value=30, inplace=True)
print(df)

DataFrame 是進行資料科學和分析工作時非常強大的工具,它提供了靈活的資料操作和分析功能。

4.讀取格式各樣的資料

Pandas 提供了多種函式來讀取不同格式的資料檔案,這些函式使得資料匯入變得非常簡單和直接。以下是一些常用的資料讀取方法:

4.1 讀取 CSV 格式檔案

CSV(逗號分隔值)檔案是一種常見的資料交換格式。Pandas 的 read_csv 函式可以輕鬆讀取 CSV 檔案。

import pandas as pd

# 讀取 CSV 檔案
df = pd.read_csv('path_to_file.csv')

# 顯示前幾行資料
print(df.head())

read_csv 函式提供了許多引數來處理不同的 CSV 格式,例如指定分隔符、處理缺失值、選擇特定的列等。

4.2 讀取 Excel 檔案

Excel 檔案是一種廣泛使用的電子表格格式。Pandas 的 read_excel 函式可以用來讀取 Excel 檔案。

# 讀取 Excel 檔案
df = pd.read_excel('path_to_file.xlsx')

# 顯示前幾行資料
print(df.head())

read_excel 函式允許你指定工作表、讀取特定的單元格範圍等。

4.3 讀取 SQL 檔案

Pandas 可以透過 SQL Alchemy 連線到資料庫,並使用 read_sqlread_sql_query 函式讀取 SQL 資料。

from sqlalchemy import create_engine
import pandas as pd

# 建立資料庫連線引擎
engine = create_engine('database_connection_string')

# 讀取 SQL 查詢結果
df = pd.read_sql_query('SELECT * FROM table_name', con=engine)

# 顯示前幾行資料
print(df.head())

這裡需要一個有效的資料庫連線字串,以及對應的資料庫驅動。

4.4 讀取 HTML 檔案

Pandas 的 read_html 函式可以解析 HTML 中的 <table> 標籤,並將其轉換為 DataFrame 物件。

# 讀取 HTML 檔案
df = pd.read_html('path_to_file.html')

# df 是一個 DataFrame 列表,選擇第一個 DataFrame
df = df[0]

# 顯示前幾行資料
print(df.head())

read_html 函式會嘗試找到 HTML 檔案中所有的 <table> 標籤,並返回一個包含所有表格資料的 DataFrame 列表。

在讀取這些檔案時,Pandas 允許你指定各種引數來處理檔案中的特定格式,例如編碼、列名、資料型別等。這些函式大大簡化了從不同資料來源匯入資料的過程。

5.資料預處理

資料預處理是資料分析和機器學習專案中的關鍵步驟,Pandas 提供了多種工具來幫助我們完成這些任務。以下是一些常見的資料預處理技術:

5.1 使用布林值篩選資料

布林索引允許我們根據條件篩選資料。我們可以對 DataFrameSeries 使用布林表示式來選擇滿足條件的行或列。

import pandas as pd

# 假設我們有以下 DataFrame
df = pd.DataFrame({
    'Age': [25, 30, 35, 40, 45],
    'Name': ['John', 'Anna', 'Peter', 'Linda', 'Michael']
})

# 使用布林值篩選年齡大於 30 的人
filtered_df = df[df['Age'] > 30]
print(filtered_df)

5.2 使用 where 方法篩選資料

where 方法可以根據一個條件表示式來過濾資料,返回一個滿足條件的布林型 DataFrameSeries

# 使用 where 方法篩選年齡大於 30 的人
filtered_df = df.where(df['Age'] > 30)
print(filtered_df)

where 方法返回的結果是對原始資料的布林型掩碼,如果需要替換不滿足條件的值,可以結合 fillnamask 方法使用。

5.3 修改資料

直接透過標籤或位置修改資料。

# 修改特定行的資料
df.loc[df['Name'] == 'John', 'Age'] = 28

# 修改特定列的資料
df['Age'] = df['Age'] + 1
print(df)

5.4 缺失值處理

缺失值處理是資料預處理中的一個重要部分。Pandas 提供了多種方法來處理缺失值。

# 刪除包含缺失值的行
df_cleaned = df.dropna()

# 填充缺失值
df_filled = df.fillna(value=0)
print(df_filled)

還可以使用 interpolate 方法來進行插值填充。

5.5 排序

排序是資料分析中的常見操作,Pandas 提供了 sort_values 方法來對資料進行排序。

# 按年齡升序排序
sorted_df = df.sort_values(by='Age')

# 按年齡降序排序
sorted_df_desc = df.sort_values(by='Age', ascending=False)
print(sorted_df)
print(sorted_df_desc)

排序時可以指定多個列,並設定是否升序或降序。

這些是資料預處理中常用的一些操作,Pandas 提供的這些功能使得資料清洗和準備變得非常高效和方便。

6.統計計算

統計計算是資料分析中的核心部分,Pandas 提供了豐富的函式來進行描述性統計分析。以下是一些常用的統計計算方法:

6.1 常見的統計函式

描述性統計

  • count(): 計算非NA/null值的數量。
  • mean(): 計算平均值。
  • median(): 計算中位數。
  • min()max(): 計算最小值和最大值。
  • std()var(): 計算標準差和方差。
  • sum(): 計算總和。
  • size(): 返回資料的總大小。
import pandas as pd

# 建立一個簡單的 DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 40, 50]
})

# 計算描述性統計
print(df.describe())

分佈和形狀

  • skew(): 計算偏度(資料分佈的不對稱性)。
  • kurt(): 計算峰度(資料分佈的“尾部”程度)。
print(df.skew())
print(df.kurt())

相關性

  • corr(): 計算列之間的相關係數。
print(df.corr())

自定義統計

  • agg(): 允許應用多個統計函式。
print(df.agg(['mean', 'max', 'min']))

6.2 快速統計彙總

Pandas 的 describe() 方法可以快速提供一個資料框的彙總統計,包括平均值、標準差、最小值、最大值等。

# 對整個 DataFrame 進行描述性統計
print(df.describe())

# 對指定列進行描述性統計
print(df[['A', 'B']].describe())

describe() 方法預設計算數值列的統計資訊,但也可以用於字串型別的列,此時會顯示計數、唯一值數量、最常見值等資訊。

對於分類資料,可以使用 value_counts() 方法來檢視每個類別的頻率。

# 假設我們有一個分類列
df['Category'] = ['A', 'B', 'A', 'C', 'B']
print(df['Category'].value_counts())

統計計算是資料分析的基礎,Pandas 提供的這些功能使得從資料中提取有意義的統計資訊變得非常簡單。透過這些統計函式,我們可以快速瞭解資料的分佈、中心趨勢和離散程度。

7.交叉統計

在 Pandas 中,groupby()pivot_table() 是兩個非常強大的工具,它們可以幫助我們對資料進行分組和彙總統計。

7.1 使用 groupby() 統計

groupby() 方法允許我們根據一個或多個鍵將資料分組,然後對每個組應用聚合函式,如 sum()mean()count() 等。

import pandas as pd

# 建立一個示例 DataFrame
df = pd.DataFrame({
    'Category': ['A', 'B', 'A', 'B', 'C', 'A', 'B', 'C'],
    'Values': [10, 20, 30, 40, 50, 60, 70, 80]
})

# 根據 'Category' 列分組,並計算每個組的總和
grouped_sum = df.groupby('Category')['Values'].sum()
print(grouped_sum)

# 可以同時應用多個聚合函式
grouped_stats = df.groupby('Category')['Values'].agg(['sum', 'mean', 'count'])
print(grouped_stats)

groupby() 也可以用於多級分組,即根據多個列進行分組。

# 假設我們有另一個列 'Subcategory'
df['Subcategory'] = ['X', 'X', 'Y', 'Y', 'X', 'Y', 'X', 'Y']
grouped_multi = df.groupby(['Category', 'Subcategory'])['Values'].sum()
print(grouped_multi)

7.2 使用 pivot_table() 統計

pivot_table() 方法類似於 groupby(),但它提供了更多的靈活性,允許我們重新排列資料,建立一個透視表,其中指定的列成為行和列索引,而其他列則用於計算值。

# 建立透視表,以 'Category' 為行索引,'Subcategory' 為列索引,計算 'Values' 的總和
pivot_table = df.pivot_table(index='Category', columns='Subcategory', values='Values', aggfunc='sum')
print(pivot_table)

pivot_table() 方法非常靈活,可以處理多個聚合函式,並且可以填充缺失值,處理缺失的組合等。

# 建立透視表,並填充缺失值
pivot_table_filled = df.pivot_table(index='Category', columns='Subcategory', values='Values', aggfunc='sum', fill_value=0)
print(pivot_table_filled)

pivot_table() 還允許我們指定多個聚合函式,並對結果進行進一步的處理。

# 建立透視表,並應用多個聚合函式
pivot_table_multi = df.pivot_table(index='Category', columns='Subcategory', values='Values', aggfunc=['sum', 'mean'])
print(pivot_table_multi)

這些工具在資料分析中非常有用,特別是當你需要對資料進行分組分析或建立複雜的彙總報表時。透過 groupby()pivot_table(),我們可以輕鬆地對資料進行多維度的探索和分析。

8.時間序列的資料處理

時間序列資料是一系列按照時間順序排列的資料點。在金融、氣象、經濟和其他許多領域中,時間序列分析是一個重要的分析工具。Pandas 提供了強大的工具來處理時間序列資料。

8.1 使用時間序列資料的函式

Pandas 提供了一系列專門用於處理時間序列資料的函式。這些函式可以幫助我們對時間序列資料進行索引、重取樣、移動視窗統計等操作。

import pandas as pd
import datetime as dt

# 建立時間序列資料
dates = pd.date_range('20230101', periods=6)
values = [10, 20, 25, 30, 40, 50]
ts = pd.Series(values, index=dates)

# 訪問時間序列資料
print(ts)

# 時間序列的日期偏移
ts_1day_later = ts.shift(1)
print(ts_1day_later)

# 時間序列的滾動統計
rolling_mean = ts.rolling(window=3).mean()
print(rolling_mean)

8.2 DatetimeIndex

DatetimeIndex 是 Pandas 中專門用於時間序列的索引物件。它能夠處理日期和時間資料,並提供豐富的時間序列功能。

# 建立 DatetimeIndex
index = pd.DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03'])

# 將 DatetimeIndex 設定為範圍
date_range = pd.date_range(start='2023-01-01', end='2023-01-10', freq='D')

# 建立時間序列資料
ts_with_range = pd.Series(range(10), index=date_range)
print(ts_with_range)

8.3 篩選時間序列資料

可以使用 DatetimeIndex 來篩選時間序列資料。

# 篩選特定時間段的資料
selected_ts = ts['2023-01-02':'2023-01-04']
print(selected_ts)

8.4 取樣

時間序列資料的取樣是指從時間序列中提取特定時間點的資料。Pandas 允許我們使用 resample 方法對時間序列資料進行取樣。

# 重取樣時間序列資料
resampled_ts = ts.resample('D').mean()  # 每日平均值
print(resampled_ts)

# 可以指定不同的頻率
resampled_ts_monthly = ts.resample('M').mean()  # 每月平均值
print(resampled_ts_monthly)

在處理時間序列資料時,Pandas 提供的這些工具可以幫助我們有效地管理和分析資料。透過時間序列分析,我們可以識別資料中的模式、趨勢和季節性變化,這對於預測和決策制定非常有價值。

相關文章