從基礎到高級解析Pandas?DataFrame數據操作的完整指南
DataFrame作為Pandas的核心數據結構,其數據操作能力覆蓋了從基礎訪問到高級分析的全場景。本文將系統梳理DataFrame的數據訪問、篩選、轉換、聚合和高級操作五大核心能力,結合代碼示例和性能優(yōu)化技巧,幫助讀者全面掌握這一數據分析利器。
一、數據訪問:精準定位數據的N種方式
1.列訪問:直接索引與屬性訪問
字典式訪問:通過列名直接獲取Series對象
import pandas as pd
df = pd.DataFrame({'A': [1, 2], 'B': ['x', 'y']})
col_a = df['A'] # 返回Series
屬性訪問(僅限列名符合變量命名規(guī)則時):
col_a = df.A # 等效于df['A'],但列名含空格或特殊字符時會報錯
2.行訪問:標簽索引與位置索引
.loc[]:按標簽索引(包含末端)
df = pd.DataFrame({'A': [1, 2, 3]}, index=['a', 'b', 'c'])
print(df.loc['a':'b']) # 輸出行'a'和'b'
.iloc[]:按位置索引(不包含末端)
print(df.iloc[0:2]) # 輸出前兩行(位置0和1)
混合索引:同時訪問行和列
print(df.loc['a', 'A']) # 輸出行'a'列'A'的值(1) print(df.iloc[0, 0]) # 等效操作(位置索引)
3.條件篩選:布爾索引與查詢函數
布爾索引:通過條件表達式篩選
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['x', 'y', 'z']})
result = df[df['A'] > 1] # 篩選A列值大于1的行
.query()方法:字符串形式編寫條件(適合復雜條件)
result = df.query('A > 1 and B != "z"') # 篩選A>1且B≠'z'的行
4.多級索引訪問:Hierarchical Indexing
創(chuàng)建多級索引DataFrame:
arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=('Letter', 'Number'))
df = pd.DataFrame({'Data': [10, 20, 30, 40]}, index=index)
訪問特定層級數據:
print(df.loc['A']) # 篩選Letter='A'的所有行
print(df.loc[('A', 1)]) # 精確篩選Letter='A'且Number=1的行
print(df.xs('A', level='Letter')) # 使用xs方法按層級篩選
二、數據修改:增刪改查的全流程控制
1.添加數據:列與行的擴展
添加列:
df['C'] = [True, False, True] # 直接賦值 df['D'] = df['A'] * 2 # 通過運算生成新列
添加行:
使用loc擴展索引:
df.loc[3] = [4, 'w', False, 8] # 添加新行(索引為3)
使用append(已棄用,推薦pd.concat):
new_row = pd.DataFrame({'A': [5], 'B': ['v']})
df = pd.concat([df, new_row], ignore_index=True)
2.刪除數據:列與行的移除
刪除列:
df.drop('C', axis=1, inplace=True) # 刪除列'C'
刪除行:
df.drop([0, 2], axis=0, inplace=True) # 刪除索引為0和2的行
條件刪除:
df = df[df['A'] != 2] # 刪除A列值為2的行
3.修改數據:精準更新與批量替換
單值修改:
df.loc[0, 'A'] = 100 # 修改索引0行A列的值為100
批量替換:
df['A'].replace(100, 1000, inplace=True) # 將A列所有100替換為1000
按條件替換:
df['A'] = df['A'].apply(lambda x: x * 2 if x > 1 else x) # A列值>1時乘以2
三、數據轉換:重塑與重構數據結構
1.數據透 視:pivot與pivot_table
pivot:將長格式數據轉換為寬格式
data = {'Date': ['2023-01-01', '2023-01-01', '2023-01-02'],
'Category': ['A', 'B', 'A'],
'Value': [10, 20, 30]}
df = pd.DataFrame(data)
pivot_df = df.pivot(index='Date', columns='Category', values='Value')
pivot_table:支持聚合的透 視表
pivot_table_df = df.pivot_table(index='Date', columns='Category', values='Value', aggfunc='mean')
2.熔化數據:melt(寬轉長)
melted_df = pd.melt(pivot_df, var_name='Category', value_name='Value')
3.數據合并:merge與join
merge:類似SQL的連接操作
left = pd.DataFrame({'Key': ['A', 'B'], 'Value1': [1, 2]})
right = pd.DataFrame({'Key': ['A', 'B'], 'Value2': [3, 4]})
merged_df = pd.merge(left, right, on='Key', how='inner') # 內連接
join:基于索引的快速合并
left.set_index('Key', inplace=True)
right.set_index('Key', inplace=True)
joined_df = left.join(right, how='left') # 左連接
4.數據排序:sort_values與sort_index
按值排序:
df.sort_values('A', ascending=False, inplace=True) # 按A列降序排序
按索引排序:
df.sort_index(inplace=True) # 按行索引排序
四、數據聚合:分組計算與統計分析
1.分組聚合:groupby
基礎分組計算:
df = pd.DataFrame({'Category': ['A', 'B', 'A', 'B'],
'Value': [10, 20, 30, 40]})
grouped = df.groupby('Category')['Value'].agg(['sum', 'mean', 'count'])
多列分組:
df['Subcategory'] = ['X', 'Y', 'X', 'Y'] multi_grouped = df.groupby(['Category', 'Subcategory'])['Value'].sum()
2.窗口函數:rolling與expanding
滾動計算:
df = pd.DataFrame({'Value': [1, 2, 3, 4, 5]})
df['Rolling_Mean'] = df['Value'].rolling(window=3).mean() # 3期移動平均
擴展計算:
df['Expanding_Sum'] = df['Value'].expanding().sum() # 累計求和
3.高級聚合:transform與apply
transform:返回與分組大小相同的Series
df['Group_Mean'] = df.groupby('Category')['Value'].transform('mean')
apply:自定義聚合函數
def custom_agg(x):
return x.max() - x.min()
df['Value_Range'] = df.groupby('Category')['Value'].apply(custom_agg)
五、高級操作:超越基礎的數據處理
1.時間序列處理
生成時間索引:
dates = pd.date_range('2023-01-01', periods=5, freq='D')
df = pd.DataFrame({'Value': [1, 2, 3, 4, 5]}, index=dates)
時間重采樣:
df.resample('W').sum() # 按周匯總
2.文本處理:字符串方法
列級字符串操作:
df = pd.DataFrame({'Text': ['apple', 'banana', 'cherry']})
df['Text_Length'] = df['Text'].str.len() # 計算字符串長度
df['Text_Upper'] = df['Text'].str.upper() # 轉換為大寫
3.分類數據:astype('category')
轉換為分類類型:
df['Category'] = df['Category'].astype('category')
獲取分類信息:
print(df['Category'].cat.categories) # 輸出所有類別 print(df['Category'].cat.codes) # 輸出類別編碼
4.性能優(yōu)化技巧
使用categorical減少內存:
df['Category'] = df['Category'].astype('category') # 尤其適合低基數列
避免鏈式操作:
# 不推薦(可能引發(fā)SettingWithCopyWarning) df[df['A'] > 1]['B'] = 0 # 推薦 mask = df['A'] > 1 df.loc[mask, 'B'] = 0
使用eval加速計算(適合大型DataFrame):
df.eval('C = A * B', inplace=True) # 比直接賦值更快
六、總結:DataFrame操作的核心原則
- 向量化優(yōu)先:盡量避免逐行循環(huán),優(yōu)先使用Pandas內置的向量化操作。
- 鏈式操作謹慎:復雜的鏈式操作可能引發(fā)警告或錯誤,建議拆分為多步。
- 內存效率:對大型數據集,優(yōu)先使用
categorical類型和chunksize分塊處理。 - 索引設計:合理設計索引(如時間索引、多級索引)可顯著提升查詢效率。
掌握這些操作后,DataFrame將不再僅僅是數據容器,而是能高效完成數據清洗、轉換、分析和可視化的全能工具。無論是處理百萬級數據集還是復雜分析場景,DataFrame都能通過簡潔的語法實現強大的功能。
以上就是從基礎到高級解析Pandas DataFrame數據操作的完整指南的詳細內容,更多關于Pandas DataFrame數據操作的資料請關注腳本之家其它相關文章!
相關文章
Python+OpenCV實戰(zhàn)之利用?K-Means?聚類進行色彩量化
這篇文章主要介紹了如何利用?K-Means?聚類進行色彩量化,以減少圖像中顏色數量。文中的代碼具有一定的學習價值,感興趣的小伙伴可以關注一下2021-12-12
python中自定義異常/raise關鍵字拋出異常的案例解析
在編程過程中合理的使用異??梢允沟贸绦蛘5膱?zhí)行,本篇文章給大家介紹python中自定義異常/raise關鍵字拋出異常案例解析,需要的朋友可以參考下2024-01-01

