Pandas是Python生態系統中最強大、最流行的數據分析庫,專為處理結構化數據(如表格和時間序列)而設計。它提供了高效的數據結構和豐富的功能,使得數據清洗、轉換、分析和可視化變得簡單直觀。
一、Pandas庫的安裝詳解
1. 安裝前的準備
在安裝Pandas之前,建議先確保已安裝Python環境(建議Python 3.6及以上版本)。可以通過以下命令檢查Python版本:
python --version
或
python3 --version
2. 安裝方法
方法一:使用pip安裝(推薦)
這是最簡單直接的安裝方式:
pip install pandas
如果需要安裝特定版本:
pip install pandas==1.3.5#本篇所用版本
方法二:使用conda安裝(適合Anaconda用戶)
conda install pandas
方法三:源碼安裝(適合開發者)
git clone https://github.com/pandas-dev/pandas.git
cd pandas
python setup.py install
3. 驗證安裝
安裝完成后,可以通過以下方式驗證:
import pandas as pd
print(pd.__version__)
4. 常見問題解決
安裝速度慢
可以更換國內的鏡像源:
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
二、pandas的數據結構
pandas 主要提供了兩種核心數據結構:
Series(一維數組)
- 類似于帶標簽的一維數組
- 由兩個數組組成:一個存儲數據,一個存儲索引(默認從0開始)
- 示例:
import pandas as pd s = pd.Series([1, 3, 5, 7], index=['a', 'b', 'c', 'd'])
- 特性:
- 支持向量化操作
- 可以存儲任意數據類型
- 索引可以重復
DataFrame(二維表格)
- 類似于電子表格或SQL表
- 由多個Series組成的字典結構
- 示例:
data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30]} df = pd.DataFrame(data)
- 特性:
- 行索引(index)和列索引(columns)
- 支持列的不同數據類型
- 提供豐富的數據操作方法
適用場景??
??Series??
??DataFrame??
??單變量分析??:如時間序列數據(股價、溫度記錄)。
??簡單統計??:計算均值、最大值等基礎統計量。
??作為DataFrame組件??:DataFrame的列本質上是Series。
??結構化數據分析??:如CSV文件、SQL表、Excel表格。
??復雜操作??:數據清洗(去重、填充缺失值)、分組聚合(
groupby
)、透視表。??機器學習??:特征工程、數據預處理(如標準化、編碼)。
這些數據結構為數據分析提供了強大的基礎,支持從數據讀取、清洗到分析的全流程操作。
三、pandas數據讀取與寫入
讀取數據
pandas提供了多種方法來讀取不同格式的數據文件:
1. 讀取CSV文件
import pandas as pd# 基本讀取
df = pd.read_csv('data.csv')# 帶參數讀取
df = pd.read_csv('data.csv', encoding='utf-8',header=0, # 指定表頭行index_col=0, # 指定索引列na_values=['NA', 'N/A']) # 指定缺失值標識
2. 讀取Excel文件
# 讀取單個sheet
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')# 讀取整個Excel文件的所有sheet
excel_file = pd.ExcelFile('data.xlsx')
df1 = excel_file.parse('Sheet1')
df2 = excel_file.parse('Sheet2')
3. 讀取JSON文件
df = pd.read_json('data.json', orient='records')
4. 讀取SQL數據庫
from sqlalchemy import create_engine# 創建數據庫連接
engine = create_engine('sqlite:///database.db')# 讀取數據
df = pd.read_sql('SELECT * FROM table_name', con=engine)
寫入數據
pandas同樣支持多種數據格式的輸出:
1. 寫入CSV文件
df.to_csv('output.csv',index=False, # 不寫入索引encoding='utf-8',columns=['col1', 'col2']) # 指定寫入的列
2. 寫入Excel文件
# 寫入單個sheet
df.to_excel('output.xlsx', sheet_name='Data')# 寫入多個sheet
with pd.ExcelWriter('output.xlsx') as writer:df1.to_excel(writer, sheet_name='Sheet1')df2.to_excel(writer, sheet_name='Sheet2')
3. 寫入JSON文件
df.to_json('output.json', orient='records')
4. 寫入SQL數據庫
# 寫入新表
df.to_sql('new_table', con=engine, if_exists='fail')# 追加到現有表
df.to_sql('existing_table', con=engine, if_exists='append')
其他實用功能
1. 處理大文件
對于大文件可以使用分塊讀取:
chunk_size = 10000
chunks = pd.read_csv('large_file.csv', chunksize=chunk_size)for chunk in chunks:# 處理每個數據塊process(chunk)
2. 數據類型指定
dtypes = {'col1': 'int32', 'col2': 'category'}
df = pd.read_csv('data.csv', dtype=dtypes)
3. 日期解析
df = pd.read_csv('data.csv', parse_dates=['date_column'])
四、pandas數據查看與檢查
head()和tail()方法
df.head(n)
:查看DataFrame的前n行,默認顯示前5行df.head(10) # 查看前10行數據
df.tail(n)
:查看DataFrame的后n行,默認顯示后5行df.tail(3) # 查看最后3行數據
數據概覽
df.shape
:查看DataFrame的形狀(行數,列數)print(df.shape) # 輸出類似(1000, 15)表示1000行15列
df.info()
:查看數據集的整體信息- 顯示每列的非空值數量
- 每列的數據類型
- 內存使用情況
df.info() # 輸出各列詳細信息
數據統計信息檢查
describe()方法
df.describe()
:生成描述性統計信息- 數值型列:計數、均值、標準差、最小值、四分位數、最大值
- 非數值型列:計數、唯一值數量、頻數最高的值及其出現次數
df.describe(include='all') # 包含所有列 df.describe(include=['float64']) # 只包含浮點數列
唯一值和頻率統計
df.nunique()
:查看每列的唯一值數量df.nunique() # 各列唯一值數量
df.value_counts()
:查看某列的值分布df['gender'].value_counts(normalize=True) # 顯示比例而非計數
數據類型和缺失值檢查
數據類型檢查
df.dtypes
:查看各列的數據類型print(df.dtypes) # 輸出各列數據類型
- 類型轉換示例:
df['date'] = pd.to_datetime(df['date']) # 轉換為日期類型 df['price'] = df['price'].astype(float) # 轉換為浮點數
缺失值檢查
df.isnull()
:返回布爾矩陣,顯示每個元素是否為缺失值df.isnull().sum() # 統計每列缺失值數量
- 缺失值可視化:
import matplotlib.pyplot as plt import seaborn as snssns.heatmap(df.isnull(), cbar=False) plt.show()
更高級的數據檢查方法
數據抽樣
df.sample()
:隨機抽樣查看數據df.sample(5) # 隨機查看5行 df.sample(frac=0.1) # 抽取10%的數據
條件篩選檢查
- 使用布爾索引篩選特定數據
# 查看年齡大于30的記錄 df[df['age'] > 30]# 查看特定城市和性別的記錄 df[(df['city'] == 'Beijing') & (df['gender'] == 'Female')]
重復值檢查
df.duplicated()
:檢查重復行df.duplicated().sum() # 統計重復行數 df[df.duplicated()] # 查看重復行
- 特定列重復檢查:
df.duplicated(subset=['id', 'date']).sum() # 檢查ID和日期組合是否重復
五、pandas數據選擇與過濾
1. 列選擇
列選擇是最基礎的數據操作之一,通過列名來獲取指定列的數據。
單列選擇
df['Name'] # 返回Name列的所有數據,返回類型為Series
多列選擇
df[['Name', 'Age']] # 返回包含Name和Age兩列的數據,返回類型為DataFrame
應用場景:當只需要分析特定幾列數據時使用,例如只需要查看客戶的姓名和年齡信息。
2. 行選擇
行選擇可以通過標簽或位置索引來獲取數據。
按標簽選擇行(loc)
df.loc[0] # 返回索引標簽為0的行數據
df.loc[0:2] # 返回索引標簽從0到2的行數據(包含2)
按位置選擇行(iloc)
df.iloc[0] # 返回第一行數據(位置索引從0開始)
df.iloc[0:3] # 返回第1到第3行數據(不包含3)
注意事項:
- loc是基于標簽的索引,包含結束位置
- iloc是基于位置的索引,不包含結束位置
3. 條件過濾
pandas 提供了強大的布爾索引(Boolean Indexing)功能,可以根據條件表達式篩選 DataFrame 或 Series 中的數據。這種過濾方式非常靈活高效,是數據清洗和預處理中的常用操作。
test = pd.DataFrame({1:[1,2,3],2:[4,5,6],3:[7,8,9],4:[10,11,12],5:[13,14,15]})
print(test[[True,False,False]])#輸出布爾值為Ture的行。結果為1,4,7,10,13
簡單條件過濾
df[df['Age'] > 30] # 篩選出年齡大于30歲的所有記錄
多條件組合過濾
df[(df['Age'] > 25) & (df['City'] == 'NY')] # 篩選年齡大于25歲且居住在NY的記錄
示例說明:假設我們有一個客戶數據集,包含Name、Age、City等字段。使用多條件過濾可以快速找到特定城市的特定年齡段客戶。
運算符說明:
- & 表示邏輯與
- | 表示邏輯或
- ~ 表示邏輯非
注意:多個條件必須用括號括起來,否則會報錯。
六、數據處理
1. 缺失值處理
缺失值是數據分析中常見的問題,pandas提供了多種處理方式:
刪除缺失值
df.dropna() # 默認刪除包含任何缺失值的整行
df.dropna(axis=1) # 刪除包含缺失值的列
df.dropna(thresh=3) # 只保留至少有3個非缺失值的行
填充缺失值
df.fillna(0) # 用0填充所有缺失值
df.fillna({'Salary': df['Salary'].mean(), 'Age': 30}) # 對不同列使用不同填充值
df.fillna(method='ffill') # 用前一個有效值向前填充
缺失值檢測
df.isnull() # 返回布爾DataFrame,顯示每個位置是否為缺失值
df.isnull().sum() # 計算每列的缺失值數量
df[df['Age'].isnull()] # 篩選出Age列為缺失值的行
2. 重復值處理
重復數據會影響分析結果,常見的處理方法包括:
df.drop_duplicates() # 刪除完全相同的行
df.drop_duplicates(subset=['Name', 'Phone']) # 基于指定列判斷重復
df.drop_duplicates(keep='last') # 保留最后一次出現的重復行
df.drop_duplicates(keep=False) # 刪除所有重復行
3. 數據排序
數據排序有助于發現模式和異常值:
df.sort_values('Age') # 按年齡升序排序
df.sort_values('Age', ascending=False) # 按年齡降序排序
df.sort_values(['Department', 'Salary'], ascending=[True, False]) # 多列排序
df.sort_index() # 按索引排序
4. 數據分組
分組是數據分析的核心操作,可用于計算各種統計量:
# 基本分組
df.groupby('City')['Age'].mean() # 按城市分組計算平均年齡# 多重分組
df.groupby(['City', 'Gender'])['Income'].median() # 按城市和性別分組計算收入中位數# 多聚合函數
df.groupby('Department').agg({'Salary': ['mean', 'max', 'min'],'Age': 'median'
})# 分組后應用自定義函數
def top_earners(group):return group.nlargest(3, 'Salary')df.groupby('Department').apply(top_earners)
七、數據轉換
1.添加新列 通過布爾條件創建新列是數據預處理中的常見操作:
df['Senior'] = df['Age'] > 30 # 添加布爾列,標記年齡大于30歲的員工
示例應用場景:在人力資源數據分析中,可以用此方法快速區分資深員工和普通員工,便于后續分組分析。
2.應用函數 使用apply方法可以對列數據進行函數處理:
df['Name_Length'] = df['Name'].apply(len) # 計算每個姓名的字符長度
df['Salary_Adjusted'] = df['Salary'].apply(lambda x: x*1.1) # 工資上調10%
最佳實踐:當需要執行復雜轉換時,可以定義單獨的函數然后傳入apply,提高代碼可讀性3
3.數據合并 Pandas提供多種數據合并方式: 縱向合并(堆疊):
pd.concat([df1, df2], axis=0) # 默認縱向合并,相同結構的兩個表格上下拼接
pd.concat([df1, df2], ignore_index=True) # 重建索引
橫向合并(連接):
# 內連接,基于共同鍵值合并
pd.merge(df1, df2, on='employee_id', how='inner')# 左連接,保留左邊表的所有記錄
pd.merge(df1, df2, on='department', how='left')# 外連接,保留所有記錄
pd.merge(df1, df2, on='project_id', how='outer')
合并操作常用于:將分散在不同表中的相關數據整合到一起,比如將員工信息表與部門信息表合并。