從零到精通:Pandas 數據分析完全指南
1. Pandas簡介
Pandas是Python中最重要的數據分析庫之一,提供了高效的數據結構和數據分析工具。它的核心數據結構包括Series(一維數組)和DataFrame(二維表格),能夠輕松處理結構化數據。

2. 安裝與導入
# 安裝pandas
pip install pandas
# 導入pandas
import pandas as pd
import numpy as np3. Series:一維數據結構
(1) 創建Series
# 從列表創建
s1 = pd.Series([1, 3, 5, 7, 9])
print(s1)
# 指定索引
s2 = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s2)
# 從字典創建
data_dict = {'北京': 2154, '上海': 2424, '廣州': 1867, '深圳': 1756}
s3 = pd.Series(data_dict)
print(s3)(2) Series基本操作
# 訪問元素
print(s3['北京']) # 通過標簽
print(s3[0]) # 通過位置
# 切片操作
print(s3['北京':'廣州']) # 標簽切片(包含結束位置)
print(s3[0:2]) # 位置切片(不包含結束位置)
# 運算
print(s3 * 10) # 所有值乘以10
print(s3 > 2000) # 布爾索引
print(s3[s3 > 2000]) # 篩選大于2000的值4. DataFrame:二維數據結構
(1) 創建DataFrame
# 從字典創建
data = {
'姓名': ['張三', '李四', '王五', '趙六'],
'年齡': [25, 30, 35, 28],
'城市': ['北京', '上海', '廣州', '深圳'],
'薪資': [8000, 12000, 10000, 9500]
}
df = pd.DataFrame(data)
print(df)
# 從列表的列表創建
data_list = [
['張三', 25, '北京', 8000],
['李四', 30, '上海', 12000],
['王五', 35, '廣州', 10000],
['趙六', 28, '深圳', 9500]
]
df2 = pd.DataFrame(data_list, columns=['姓名', '年齡', '城市', '薪資'])
print(df2)
# 設置索引
df.index = ['員工1', '員工2', '員工3', '員工4'](2) 查看數據
# 查看前幾行
print(df.head(2))
# 查看后幾行
print(df.tail(2))
# 查看基本信息
print(df.info())
# 查看統計摘要
print(df.describe())
# 查看形狀(行數,列數)
print(df.shape)
# 查看列名
print(df.columns)
# 查看索引
print(df.index)5. 數據選擇與索引
(1) 選擇列
# 選擇單列(返回Series)
print(df['姓名'])
# 選擇多列(返回DataFrame)
print(df[['姓名', '薪資']])(2) 選擇行
# 使用loc(基于標簽)
print(df.loc['員工1'])
print(df.loc['員工1':'員工3'])
print(df.loc[['員工1', '員工3']])
# 使用iloc(基于位置)
print(df.iloc[0]) # 第一行
print(df.iloc[0:2]) # 前兩行
print(df.iloc[[0, 2]]) # 第1和第3行(3) 選擇行和列
# loc選擇特定行列
print(df.loc['員工1', '姓名'])
print(df.loc['員工1':'員工3', ['姓名', '薪資']])
# iloc選擇特定行列
print(df.iloc[0, 0])
print(df.iloc[0:2, [0, 3]])(4) 條件篩選
# 單條件篩選
print(df[df['年齡'] > 28])
# 多條件篩選
print(df[(df['年齡'] > 25) & (df['薪資'] > 9000)])
# 使用isin方法
print(df[df['城市'].isin(['北京', '上海'])])6. 數據操作
(1) 添加和刪除列
# 添加新列
df['部門'] = ['技術部', '銷售部', '市場部', '人力部']
df['獎金'] = df['薪資'] * 0.1
# 刪除列
df_copy = df.copy()
df_copy = df_copy.drop('獎金', axis=1) # axis=1表示刪除列
df_copy = df_copy.drop(columns=['部門']) # 另一種方式(2) 添加和刪除行
# 添加行
new_row = pd.DataFrame({
'姓名': ['孫七'],
'年齡': [32],
'城市': ['杭州'],
'薪資': [11000]
}, index=['員工5'])
df_extended = pd.concat([df, new_row])
# 刪除行
df_copy = df.drop('員工1', axis=0) # axis=0表示刪除行
df_copy = df.drop(index=['員工1', '員工2'])(3) 修改數據
# 修改單個值
df.loc['員工1', '薪資'] = 8500
# 修改整列
df['薪資'] = df['薪資'] * 1.1 # 所有薪資增長10%
# 修改多個值
df.loc[df['城市'] == '北京', '薪資'] = 90007. 數據清洗
(1) 處理缺失值
# 創建包含缺失值的DataFrame
df_missing = pd.DataFrame({
'姓名': ['張三', '李四', None, '趙六'],
'年齡': [25, None, 35, 28],
'薪資': [8000, 12000, 10000, None]
})
# 檢測缺失值
print(df_missing.isnull())
print(df_missing.isnull().sum()) # 每列缺失值數量
# 刪除包含缺失值的行
df_clean1 = df_missing.dropna()
# 刪除所有值都是缺失的行
df_clean2 = df_missing.dropna(how='all')
# 填充缺失值
df_filled = df_missing.fillna(0) # 用0填充
df_filled = df_missing.fillna({'年齡': df_missing['年齡'].mean()}) # 用均值填充
df_filled = df_missing.fillna(method='ffill') # 前向填充(2) 處理重復值
# 創建包含重復值的DataFrame
df_dup = pd.DataFrame({
'姓名': ['張三', '李四', '張三', '王五'],
'年齡': [25, 30, 25, 35]
})
# 檢測重復行
print(df_dup.duplicated())
# 刪除重復行
df_unique = df_dup.drop_duplicates()
# 保留最后一次出現的重復行
df_unique = df_dup.drop_duplicates(keep='last')(3) 數據類型轉換
# 查看數據類型
print(df.dtypes)
# 轉換數據類型
df['年齡'] = df['年齡'].astype(float)
df['薪資'] = df['薪資'].astype(int)
# 轉換為日期類型
df_date = pd.DataFrame({
'日期': ['2024-01-01', '2024-01-02', '2024-01-03']
})
df_date['日期'] = pd.to_datetime(df_date['日期'])8. 數據統計與聚合
(1) 基本統計
# 求和
print(df['薪資'].sum())
# 均值
print(df['薪資'].mean())
# 中位數
print(df['薪資'].median())
# 最大值和最小值
print(df['薪資'].max())
print(df['薪資'].min())
# 標準差
print(df['薪資'].std())
# 計數
print(df['城市'].value_counts())(2) 分組聚合(GroupBy)
# 創建示例數據
sales_data = pd.DataFrame({
'部門': ['銷售', '銷售', '技術', '技術', '市場', '市場'],
'員工': ['張三', '李四', '王五', '趙六', '孫七', '周八'],
'銷售額': [5000, 6000, 3000, 4000, 4500, 5500],
'客戶數': [10, 15, 8, 12, 11, 13]
})
# 按部門分組求和
print(sales_data.groupby('部門')['銷售額'].sum())
# 多個聚合函數
print(sales_data.groupby('部門').agg({
'銷售額': ['sum', 'mean', 'max'],
'客戶數': ['sum', 'mean']
}))
# 分組后應用自定義函數
print(sales_data.groupby('部門')['銷售額'].apply(lambda x: x.max() - x.min()))9. 數據排序
# 按單列排序
df_sorted = df.sort_values('薪資', ascending=False) # 降序
# 按多列排序
df_sorted = df.sort_values(['城市', '薪資'], ascending=[True, False])
# 按索引排序
df_sorted = df.sort_index()10. 數據合并
(1) 連接(Concatenate)
# 垂直拼接
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
result = pd.concat([df1, df2], ignore_index=True)
# 水平拼接
result = pd.concat([df1, df2], axis=1)(2) 合并(Merge)
# 創建示例數據
employees = pd.DataFrame({
'員工ID': [1, 2, 3, 4],
'姓名': ['張三', '李四', '王五', '趙六']
})
salaries = pd.DataFrame({
'員工ID': [1, 2, 3, 5],
'薪資': [8000, 9000, 10000, 11000]
})
# 內連接
result = pd.merge(employees, salaries, on='員工ID', how='inner')
# 左連接
result = pd.merge(employees, salaries, on='員工ID', how='left')
# 右連接
result = pd.merge(employees, salaries, on='員工ID', how='right')
# 外連接
result = pd.merge(employees, salaries, on='員工ID', how='outer')11. 數據透視表
# 創建示例數據
sales = pd.DataFrame({
'日期': ['2024-01', '2024-01', '2024-02', '2024-02'],
'產品': ['A', 'B', 'A', 'B'],
'地區': ['北區', '南區', '北區', '南區'],
'銷售額': [1000, 1500, 1200, 1800]
})
# 創建數據透視表
pivot = pd.pivot_table(sales,
values='銷售額',
index='產品',
columns='地區',
aggfunc='sum')
print(pivot)12. 文件讀寫
# 讀取CSV文件
df = pd.read_csv('data.csv')
df = pd.read_csv('data.csv', encoding='utf-8') # 指定編碼
# 寫入CSV文件
df.to_csv('output.csv', index=False)
# 讀取Excel文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 寫入Excel文件
df.to_excel('output.xlsx', index=False, sheet_name='數據')
# 讀取JSON文件
df = pd.read_json('data.json')
# 寫入JSON文件
df.to_json('output.json', orient='records', force_ascii=False)13. 實戰案例:銷售數據分析
# 創建銷售數據
sales_data = pd.DataFrame({
'日期': pd.date_range('2024-01-01', periods=100),
'產品': np.random.choice(['產品A', '產品B', '產品C'], 100),
'銷售額': np.random.randint(1000, 5000, 100),
'銷售量': np.random.randint(10, 50, 100),
'地區': np.random.choice(['華東', '華南', '華北'], 100)
})
# 1. 查看數據基本信息
print("數據概覽:")
print(sales_data.head())
print("\n數據統計:")
print(sales_data.describe())
# 2. 按產品統計總銷售額
print("\n各產品總銷售額:")
product_sales = sales_data.groupby('產品')['銷售額'].sum().sort_values(ascending=False)
print(product_sales)
# 3. 按地區和產品統計平均銷售額
print("\n各地區各產品平均銷售額:")
region_product_avg = sales_data.groupby(['地區', '產品'])['銷售額'].mean()
print(region_product_avg)
# 4. 找出銷售額最高的前10天
print("\n銷售額最高的前10天:")
top_10_days = sales_data.nlargest(10, '銷售額')[['日期', '產品', '銷售額']]
print(top_10_days)
# 5. 計算每個產品的銷售額占比
print("\n各產品銷售額占比:")
sales_data['銷售額占比'] = sales_data.groupby('產品')['銷售額'].transform(
lambda x: x / sales_data['銷售額'].sum() * 100
)
product_percentage = sales_data.groupby('產品')['銷售額占比'].sum()
print(product_percentage)
# 6. 按月統計銷售情況
sales_data['月份'] = sales_data['日期'].dt.to_period('M')
monthly_sales = sales_data.groupby('月份').agg({
'銷售額': 'sum',
'銷售量': 'sum'
})
print("\n月度銷售匯總:")
print(monthly_sales)14. 常用技巧總結
- 鏈式操作:Pandas支持方法鏈式調用,可以讓代碼更簡潔
- 使用.copy():修改DataFrame時使用copy()避免影響原數據
- 合理使用inplace參數:某些方法支持inplace=True直接修改原數據
- 注意內存使用:處理大數據時注意選擇合適的數據類型
- 利用向量化操作:避免使用循環,盡量使用Pandas內置方法
總結
Pandas是數據分析的強大工具,掌握其基礎用法可以大大提高數據處理效率。本文介紹了Pandas的核心概念、常用操作和實戰案例,建議在實際項目中多加練習,熟能生巧。更多高級功能可以參考官方文檔進行深入學習。


































