一、Pandas庫簡介
????????Pandas 是一個開源的 Python 數據分析庫,主要用于數據清洗、處理、探索與分析。其核心數據結構是 Series(一維數據)和 DataFrame(二維表格數據),可以讓我們高效地操作結構化數據。Pandas 提供了許多靈活且高效的數據操作方法,能夠快速地進行數據篩選、聚合、轉換和可視化,是數據科學和機器學習工作流中非常重要的一環。
二、Pandas庫安裝
??通常直接通過 pip 來安裝;當然,在Anaconda虛擬環境中亦可用如下兩種方式:
pip install pandasconda install pandas
? 在編寫中導入Pandas庫,我們通常會習慣將其簡化為pd:
import pandas as pd
三、常用的Pandas函數
1、數據讀取
Pandas庫支持多種數據格式的導入,例如 CSV、Excel、SQL 數據庫、JSON 等,方便我們從各種數據源中獲取數據。假設我們有一個CSV文件,內部如下:
ID,Name,Age,Score
1,Tom,22,85.0
2,Lily,21,92.0
3,Jack,23,78.0
4,Lucy,22,89.0
5,Rose,21,95.0
我們想要讀取,則可以:
import pandas as pd# 讀取 CSV 文件
df = pd.read_csv('sample.csv')
print(df.head()) # 查看前 5 行
樣例輸出:
ID Name Age Score
0 1 Tom 22 85.0
1 2 Lily 21 92.0
2 3 Jack 23 78.0
3 4 Lucy 22 89.0
4 5 Rose 21 95.0
?2、查看數據
如果我們想快速檢查數據的基本信息,如行數、列數、數據類型,則可以前面的基礎上加上:
print(df.info()) # 查看數據的基本信息
print(df.describe()) # 生成數據的統計摘要
樣例輸出:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 4 columns):# Column Non-Null Count Dtype
--- ------ -------------- -----0 ID 5 non-null int641 Name 5 non-null object2 Age 5 non-null int643 Score 5 non-null float64
dtypes: float64(1), int64(2), object(1)
memory usage: 288.0+ bytes
NoneID Age Score
count 5.000000 5.00000 5.000000
mean 3.000000 21.80000 87.800000
std 1.581139 0.83666 6.610598
min 1.000000 21.00000 78.000000
25% 2.000000 21.00000 85.000000
50% 3.000000 22.00000 89.000000
75% 4.000000 22.00000 92.000000
max 5.000000 23.00000 95.000000
?3、數據選擇與過濾
當然,我們還可以對數據進行選擇和過濾,就像下面這樣:
# 選擇某一列
print(df['Name'],'\n') # 選擇多列
print(df[['Name', 'Score']],'\n') # 選擇特定行(iloc 按索引,loc 按標簽)
print(df.iloc[1])
print(df.loc[df['Score'] > 90]) # 篩選成績大于 90 的行
樣例輸出:
0 Tom
1 Lily
2 Jack
3 Lucy
4 Rose
Name: Name, dtype: object Name Score
0 Tom 85.0
1 Lily 92.0
2 Jack 78.0
3 Lucy 89.0
4 Rose 95.0 ID 2
Name Lily
Age 21
Score 92.0
Name: 1, dtype: objectID Name Age Score
1 2 Lily 21 92.0
4 5 Rose 21 95.0
4、數據清洗
Pandas庫還可以處理缺失值(用dropna、fillna)、重復值(用drop_duplicates)、替換值(用replace)等。
例如:(我們先把CSV中Rose的score刪掉)
# 刪除缺失值
df_cleaned = df.dropna()
print("刪除缺失值后的DataFrame:")
print(df_cleaned.head())# 填充缺失值
df_filled = df.fillna(value={'Score': df['Score'].mean()})
print("\n填充缺失值后的DataFrame:")
print(df_filled.head())# 刪除重復值
df_unique = df.drop_duplicates()
print("\n刪除重復值后的DataFrame:")
print(df_unique.head())# 替換值
df_replaced = df.replace({'Tom': 'Tommy'})
print("\n替換值后的DataFrame:")
print(df_replaced.head())
樣例輸出:
刪除缺失值后的DataFrame:ID Name Age Score
0 1 Tom 22 85.0
1 2 Lily 21 92.0
2 3 Jack 23 78.0
3 4 Lucy 22 89.0 填充缺失值后的DataFrame:ID Name Age Score
0 1 Tom 22 85.0
1 2 Lily 21 92.0
2 3 Jack 23 78.0
3 4 Lucy 22 89.0
4 5 Rose 21 86.0 刪除重復值后的DataFrame:ID Name Age Score
0 1 Tom 22 85.0
1 2 Lily 21 92.0
2 3 Jack 23 78.0
3 4 Lucy 22 89.0
4 5 Rose 21 NaN替換值后的DataFrame:ID Name Age Score
0 1 Tommy 22 85.0
1 2 Lily 21 92.0
2 3 Jack 23 78.0
3 4 Lucy 22 89.0
4 5 Rose 21 NaN
5、數據的排序、分組求均值、合并、連接
排序會使用到sort_values函數,分組則使用groupby,合并使用merge,連接使用concat
例如:
# 按 'Score' 排序
df_sorted = df.sort_values(by='Score', ascending=False)
print("按 'Score' 排序后的數據:\n", df_sorted)# 分組并求均值
df_grouped = df.groupby('Age')['Score'].mean()
print("按 'Age' 分組并求 'Score' 的均值:\n", df_grouped)# 合并數據
df1 = pd.DataFrame({'ID': [1, 2, 3], 'Class': ['A', 'B', 'A']})
df_merged = df.merge(df1, on='ID', how='left')
print("合并后的數據:\n", df_merged)# 連接多個 DataFrame
df_concat = pd.concat([df, df1], axis=0)
print("連接后的數據:\n", df_concat)
?注意:DataFrame 是Pandas庫中的一個函數,用于創建一個數據框(DataFrame)。
????????{'ID': [1, 2, 3], 'Class': ['A', 'B', 'A']} 是一個字典,其中鍵是列名,值是對應的數據。
????????'ID' 是列名,對應的數據是 [1, 2, 3];'Class' 是列名,對應的數據是 ['A', 'B', 'A']。
????????df1 是一個新創建的數據框,包含兩列:ID和Class
????????merge是Pandas中用于合并兩個數據框的函數。
????????df1 是要與當前數據框 df 合并的另一個數據框。
????????on='ID' 指定了合并的鍵(key),即根據兩表中的 ID列進行合并。
????????how='left' 指定了合并的方式為左連接(left join)。這意味著結果將包含左表(即 df)中的所有行,即使右表(即 df1)中沒有匹配的行。如果右表中沒有匹配的行,結果中對應的列將填充為NaN。
樣例輸出:
按 'Score' 排序后的數據:ID Name Age Score
4 5 Rose 21 95.0
1 2 Lily 21 92.0
3 4 Lucy 22 89.0
0 1 Tom 22 85.0
2 3 Jack 23 78.0
按 'Age' 分組并求 'Score' 的均值:Age
21 93.5
22 87.0
23 78.0
Name: Score, dtype: float64
合并后的數據:ID Name Age Score Class
0 1 Tom 22 85.0 A
1 2 Lily 21 92.0 B
2 3 Jack 23 78.0 A
3 4 Lucy 22 89.0 NaN
4 5 Rose 21 95.0 NaN
連接后的數據:ID Name Age Score Class
0 1 Tom 22.0 85.0 NaN
1 2 Lily 21.0 92.0 NaN
2 3 Jack 23.0 78.0 NaN
3 4 Lucy 22.0 89.0 NaN
4 5 Rose 21.0 95.0 NaN
0 1 NaN NaN NaN A
1 2 NaN NaN NaN B
2 3 NaN NaN NaN A
6、數據轉換
例如:
# 創建數據透視表
pivot_table = df.pivot_table(values='Score', index='Age', aggfunc='mean')
print("透視表:\n", pivot_table)# 使用 apply() 轉換數據
df['Score_Squared'] = df['Score'].apply(lambda x: x ** 2)
print("轉換后的數據:\n", df)# 更改數據類型
df['Age'] = df['Age'].astype(float)
print("更改數據類型后的數據:\n", df)
樣例輸出:
透視表:Score
Age
21 93.5
22 87.0
23 78.0
轉換后的數據:ID Name Age Score Score_Squared
0 1 Tom 22 85.0 7225.0
1 2 Lily 21 92.0 8464.0
2 3 Jack 23 78.0 6084.0
3 4 Lucy 22 89.0 7921.0
4 5 Rose 21 95.0 9025.0
更改數據類型后的數據:ID Name Age Score Score_Squared
0 1 Tom 22.0 85.0 7225.0
1 2 Lily 21.0 92.0 8464.0
2 3 Jack 23.0 78.0 6084.0
3 4 Lucy 22.0 89.0 7921.0
4 5 Rose 21.0 95.0 9025.0
7、日期與時間處理
例如:
# 創建日期列
df['Date'] = pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05'])# 提取年份、月份、星期
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Weekday'] = df['Date'].dt.day_name()print(df)
樣例輸出:
ID Name Age Score Date Year Month Weekday
0 1 Tom 22 85.0 2023-01-01 2023 1 Sunday
1 2 Lily 21 92.0 2023-01-02 2023 1 Monday
2 3 Jack 23 78.0 2023-01-03 2023 1 Tuesday
3 4 Lucy 22 89.0 2023-01-04 2023 1 Wednesday
4 5 Rose 21 95.0 2023-01-05 2023 1 Thursday