- 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 快速統計彙總
- 6.1 常見的統計函式
- 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的特點
- 資料結構:
- DataFrame:類似於 Excel 表格,可以儲存不同型別的資料列。
- Series:一維陣列,可以儲存任何資料型別(整數、字串、浮點數、Python 物件等)。
- 資料操作:
- 支援大量的資料操作,包括資料清洗、處理缺失資料、重取樣時間序列資料等。
- 提供了豐富的資料對齊和整合處理功能。
- 資料索引:
- 支援多種索引方式,包括時間戳、整數索引、標籤索引等。
- 可以對資料進行高效的切片、篩選和分組。
- 時間序列功能:
- 強大的時間序列功能,可以輕鬆處理和分析時間序列資料。
- 資料合併:
- 提供了多種資料合併和連線工具,如
merge
、join
和concat
。
- 提供了多種資料合併和連線工具,如
- 資料分組:
- 透過
groupby
功能,可以對資料進行分組,並應用聚合函式。
- 透過
- 資料重塑:
- 支援
pivot
、melt
等操作,可以輕鬆地重塑資料結構。
- 支援
- 處理大資料:
- 雖然 Pandas 不是為處理大規模資料集而設計的,但它可以與 Dask 等庫結合使用,以處理超出記憶體限制的大型資料集。
- 整合性:
- 可以與 NumPy、SciPy、Matplotlib、Scikit-learn 等其他 Python 資料科學庫無縫整合。
- 效能:
- 底層使用 Cython 和 C 語言編寫,提供了快速的資料操作效能。
- 易用性:
- 提供了直觀的 API,使得資料操作和分析變得簡單直觀。
- 文件和社群:
- 擁有詳細的官方文件和活躍的社群,使用者可以輕鬆找到幫助和資源。
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_sql
或 read_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 使用布林值篩選資料
布林索引允許我們根據條件篩選資料。我們可以對 DataFrame
或 Series
使用布林表示式來選擇滿足條件的行或列。
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
方法可以根據一個條件表示式來過濾資料,返回一個滿足條件的布林型 DataFrame
或 Series
。
# 使用 where 方法篩選年齡大於 30 的人
filtered_df = df.where(df['Age'] > 30)
print(filtered_df)
where
方法返回的結果是對原始資料的布林型掩碼,如果需要替換不滿足條件的值,可以結合 fillna
或 mask
方法使用。
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 提供的這些工具可以幫助我們有效地管理和分析資料。透過時間序列分析,我們可以識別資料中的模式、趨勢和季節性變化,這對於預測和決策制定非常有價值。