閱讀前可參考NumPy文章
https://blog.csdn.net/MinggeQingchun/article/details/148253682https://blog.csdn.net/MinggeQingchun/article/details/148253682
?Pandas是Python中一個強大的開源數據分析庫,專門用于處理結構化數據(如表格、時間序列等),其核心數據結構為Series(一維數組)和DataFrame(二維表格)。??它基于NumPy構建,提供高效的數據清洗、操作、聚合及可視化功能,廣泛應用于數據科學領域。?
Pandas官方文檔:pandas documentation — pandas 2.2.3 documentation
1?、核心數據結構?
?Series?:一維帶標簽數組,可存儲任意數據類型(數值、字符串等),索引支持自定義或自動生成
?DataFrame?:二維表格型結構,由多個Series組成,支持行列索引和異構數據類型(每列類型可不同),類似Excel或SQL表??
2?、核心功能?
?數據清洗?:處理缺失值、去重、類型轉換等
?數據操作?:篩選、切片、合并、分組聚合(如groupby)及透視表功能
?時間序列支持?:專為金融數據分析設計,提供時間索引和窗口計算??
3?、技術優勢?
高效性?:基于NumPy的向量化操作,避免循環,優化內存使用
兼容性?:支持多種數據格式(CSV、Excel、JSON等)的讀寫,并集成Matplotlib可視化
SQL-like操作?:支持類似SQL的join和復雜查詢,簡化數據分析流程
4、Pandas 適用場景
-
數據清洗(處理缺失值、異常值、重復數據)
-
數據分析(統計、聚合、可視化前處理)
-
機器學習數據預處理(特征工程)
-
金融、科研、商業數據分析
Pandas 通常與?NumPy(數值計算)、Matplotlib/Seaborn(可視化)、Scikit-learn(機器學習)?結合使用,是 Python 數據科學生態的核心工具之一。
一、Series
Series
?是 Pandas 中最基本的一維數據結構(類似帶標簽的數組),可以存儲整數、浮點數、字符串、Python對象等類型的數據
Series?:一維帶標簽數組,可存儲任意數據類型(數值、字符串等),索引支持自定義或自動生成,由下面2個部分組成:
- values:一組數據(ndarray類型)
- index:相關的數據索引標簽
1、創建 Series
import pandas as pd# 從列表創建
s1 = pd.Series([1, 3, 5, 7, 9]) # 從字典創建(鍵自動變成索引)
s2 = pd.Series({"A": 10, "B": 20, "C": 30})# 指定索引和數據類型
s3 = pd.Series([1.1, 2.2, 3.3], index=["X", "Y", "Z"], dtype="float64")
輸出示例:
s1:
0 1
1 3
2 5
3 7
4 9
dtype: int64s2:
A 10
B 20
C 30
dtype: int64
2、訪問數據
按索引標簽或位置
# 按標簽
s2["A"] # 返回 10# 按位置(從0開始)
s2[1] # 返回 20# 切片(類似列表)
s1[1:4] # 返回第2~4個元素
布爾索引(條件篩選)
s = pd.Series([10, 20, 30, 40], index=["a", "b", "c", "d"])
s[s > 20] # 返回大于20的值
輸出:
c 30
d 40
dtype: int64
3、修改數據
# 修改單個值
s2["A"] = 99 # 批量修改
s2.replace(20, 200, inplace=True) # 把20替換成200# 增加新數據
s2["D"] = 40 # 新增索引"D",值為40
4、常用統計計算
s = pd.Series([1, 2, 3, 4, 5])s.sum() # 求和 → 15
s.mean() # 平均值 → 3.0
s.max() # 最大值 → 5
s.min() # 最小值 → 1
s.std() # 標準差 → 1.581
s.value_counts() # 統計每個值的出現次數
5、缺失值處理
s = pd.Series([1, None, 3, None, 5])s.isnull() # 返回布爾Series,標記缺失值
s.dropna() # 刪除缺失值
s.fillna(0) # 用0填充缺失值
6、向量化運算(類似NumPy)
s1 = pd.Series([1, 2, 3])
s2 = pd.Series([10, 20, 30])s1 + s2 # 對應位置相加 → [11, 22, 33]
s1 * 2 # 所有元素乘以2 → [2, 4, 6]
s1 ** 2 # 平方 → [1, 4, 9]
7、索引操作
s = pd.Series([10, 20, 30], index=["A", "B", "C"])# 修改索引
s.index = ["X", "Y", "Z"]# 重置索引(變成默認0,1,2...)
s.reset_index(drop=True, inplace=True) # `drop=True` 表示丟棄原索引
8、與 DataFrame 交互
Series 可以看作 DataFrame 的一列:
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
col_a = df["A"] # 提取列"A" → 返回Series
總結
操作 | 示例 |
---|---|
創建 | pd.Series([1, 2, 3]) |
訪問數據 | s[0] ?或?s["A"] |
條件篩選 | s[s > 2] |
修改數據 | s["A"] = 10 |
統計計算 | s.mean() |
缺失值處理 | s.fillna(0) |
向量化運算 | s1 + s2 |
Series 是 Pandas 的基礎,熟練掌握后能更高效地處理 DataFrame!
二、DataFrame
DataFrame
?是 Pandas 最核心的二維數據結構(類似 Excel 表格或 SQL 表),由行(index)和列(columns)組成,每列可以是不同數據類型。
行索引:index
列索引:columns
值:values(NumPy的二維數組)
(一)DataFrame基本操作
1、創建 DataFrame
import pandas as pd# 從字典創建(鍵是列名,值是數據)
data = {"姓名": ["張三", "李四", "王五"],"年齡": [25, 30, 28],"城市": ["北京", "上海", "廣州"]}
df = pd.DataFrame(data)# 從列表創建(需指定列名)
data = [["張三", 25, "北京"], ["李四", 30, "上海"], ["王五", 28, "廣州"]]
df = pd.DataFrame(data, columns=["姓名", "年齡", "城市"])# 指定索引
df = pd.DataFrame(data, index=["A", "B", "C"])
輸出示例:
姓名 年齡 城市
A 張三 25 北京
B 李四 30 上海
C 王五 28 廣州
2、查看數據
df.head(2) # 查看前2行
df.tail(1) # 查看最后1行
df.shape # 返回行數和列數 (3, 3)
df.columns # 查看列名
df.index # 查看行索引
df.info() # 查看數據類型和內存信息
df.describe() # 數值列的統計摘要(計數、均值、標準差等)
3、選擇數據
選擇列
df["姓名"] # 返回 Series
df[["姓名", "城市"]] # 返回多列(DataFrame)
選擇行
df.loc["A"] # 按索引標簽選擇行(返回 Series)
df.iloc[0] # 按位置選擇行(第1行)
df.loc[["A", "C"]] # 選擇多行(按標簽)
df.iloc[0:2] # 切片選擇行(第1~2行)
條件篩選
df[df["年齡"] > 25] # 年齡大于25的行
df[(df["城市"] == "北京") | (df["年齡"] < 30)] # 復合條件
4、修改數據
修改列名
df.rename(columns={"姓名": "Name", "城市": "City"}, inplace=True)
修改值
df.loc["A", "年齡"] = 26 # 修改單個值
df["年齡"] = df["年齡"] + 1 # 整列運算
新增列
df["性別"] = ["男", "女", "男"] # 直接賦值
df["是否成年"] = df["年齡"] > 18 # 基于條件
刪除列或行
df.drop("城市", axis=1, inplace=True) # 刪除列
df.drop("A", axis=0, inplace=True) # 刪除行
5、缺失值處理
df.isnull() # 檢查缺失值
df.dropna() # 刪除包含缺失值的行
df.fillna(0) # 用0填充缺失值
6、排序
df.sort_values("年齡", ascending=False) # 按年齡降序
df.sort_index(ascending=False) # 按索引降序
7、分組與聚合
df.groupby("城市")["年齡"].mean() # 按城市分組計算平均年齡
df.groupby("城市").agg({"年齡": "mean", "姓名": "count"}) # 多聚合
8、合并 DataFrame
# 縱向合并(類似 SQL UNION)
pd.concat([df1, df2], axis=0)# 橫向合并(類似 SQL JOIN)
pd.merge(df1, df2, on="共同列", how="inner") # 內連接
9、保存數據
df.to_csv("data.csv", index=False) # 保存為 CSV
df.to_excel("data.xlsx", index=False) # 保存為 Excel
總結
操作 | 示例 |
---|---|
創建 | pd.DataFrame({"列名": [數據]}) |
選擇列 | df["列名"] |
選擇行 | df.loc["索引"] |
條件篩選 | df[df["年齡"] > 25] |
修改數據 | df.loc["A", "年齡"] = 26 |
新增列 | df["新列"] = 值 |
分組聚合 | df.groupby("城市").mean() |
保存 | df.to_csv("data.csv") |
Series 和 DataFrame 的區別
(二)缺失數據處理?
1、缺失值的表示
在 Pandas 中,缺失數據主要由以下兩種形式表示:
-
NaN
?(Not a Number): 用于浮點數據類型 -
None
: 用于對象數據類型
import pandas as pd
import numpy as npdf = pd.DataFrame({'A': [1, 2, np.nan, 4],'B': [5, np.nan, np.nan, 8],'C': ['a', 'b', None, 'd']
})
2、檢測缺失值
2.1 檢查單個缺失值
pd.isna(df.loc[2, 'A']) # 檢查特定位置是否為缺失值
pd.notna(df.loc[0, 'B']) # 檢查特定位置是否不是缺失值
2.2 檢查整個DataFrame
df.isna() # 返回布爾DataFrame,顯示每個元素是否為缺失值
df.isnull() # isna()的別名,功能相同df.notna() # 返回布爾DataFrame,顯示每個元素是否不是缺失值
df.notnull() # notna()的別名
2.3 統計每列的缺失值數量
df.isna().sum() # 每列缺失值計數
df.isna().mean() # 每列缺失值比例
3、刪除缺失值
3.1 刪除包含缺失值的行
df.dropna() # 刪除任何包含缺失值的行
df.dropna(how='all') # 只刪除全為缺失值的行
df.dropna(thresh=2) # 保留至少有2個非缺失值的行
3.2 刪除包含缺失值的列
df.dropna(axis=1) # 刪除任何包含缺失值的列
df.dropna(axis=1, how='all') # 只刪除全為缺失值的列
4、填充缺失值
4.1 用固定值填充
df.fillna(0) # 用0填充所有缺失值
df.fillna({'A': 0, 'B': 1, 'C': 'unknown'}) # 不同列用不同值填充
4.2 前向填充和后向填充
df.fillna(method='ffill') # 用前一個非缺失值填充
df.fillna(method='bfill') # 用后一個非缺失值填充
df.fillna(method='ffill', limit=1) # 限制填充的連續缺失值數量
4.3 用統計值填充
df.fillna(df.mean()) # 用各列均值填充數值列
df.fillna(df.median()) # 用中位數填充
df.fillna(df.mode().iloc[0]) # 用眾數填充
4.4 插值填充
df.interpolate() # 線性插值
df.interpolate(method='time') # 時間序列插值
df.interpolate(method='polynomial', order=2) # 多項式插值
5、處理缺失值的注意事項
-
數據分析前:應該先了解缺失值的比例和模式
-
刪除缺失值:當缺失比例很小時適用,大量缺失時會導致信息損失
-
填充缺失值:要選擇合理的方法,避免引入偏差
-
時間序列數據:通常使用插值或前向/后向填充
-
機器學習模型:有些模型可以直接處理缺失值,有些需要先處理
(三)Pandas 層次化索引(MultiIndex)
1、創建層次化索引
1、創建具有 MultiIndex 的 Series
import pandas as pd
import numpy as np# 從元組列表創建
arrays = [['北京', '北京', '上海', '上海'],['東城', '西城', '浦東', '靜安']]
index = pd.MultiIndex.from_arrays(arrays, names=('城市', '區域'))
s = pd.Series([1200, 1500, 1800, 1600], index=index)# 從元組直接創建
tuples = [('北京', '東城'), ('北京', '西城'), ('上海', '浦東'), ('上海', '靜安')]
index = pd.MultiIndex.from_tuples(tuples, names=['城市', '區域'])
2、創建具有 MultiIndex 的 DataFrame
# 方法1:通過set_index
data = {'城市': ['北京', '北京', '上海', '上海'],'區域': ['東城', '西城', '浦東', '靜安'],'房價': [1200, 1500, 1800, 1600],'租金': [60, 75, 90, 80]
}
df = pd.DataFrame(data).set_index(['城市', '區域'])# 方法2:直接創建MultiIndex
index = pd.MultiIndex.from_product([['北京', '上海'], ['東城', '西城', '浦東', '靜安']],names=['城市', '區域'])
df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['房價', '租金'])
2、索引操作
1、選擇數據
# 選擇一級索引
df.loc['北京'] # 選擇北京所有區域數據# 選擇多級索引
df.loc[('北京', '東城')] # 選擇北京東城數據
df.loc[[('北京', '東城'), ('上海', '浦東')]] # 選擇多個組合# 使用xs方法跨級選擇
df.xs('東城', level='區域') # 選擇所有城市的東城區
2、部分索引
# 使用slice(None)選擇部分索引
df.loc[('北京', slice(None)), :] # 北京所有區域
df.loc[(slice(None), '東城'), :] # 所有城市的東城區
三、聚合(Aggregation),級聯(Concatenation)函數?
在Pandas中,使用聚合(Aggregation)和級聯(Chaining)函數操作是處理和分析數據幀(DataFrame)的常見方法。這些操作可以幫助你從數據中提取有用的信息、執行計算并生成新的數據集。
(一)聚合操作(Aggregation)
聚合操作通常用于將數據分組后對每個組進行計算。這可以通過groupby()
方法實現,然后使用agg()
或aggregate()
方法進行聚合計算。
常用的聚合函數包括:
-
sum()
?– 求和 -
mean()
?– 均值 -
max()
?/?min()
?– 最大值 / 最小值 -
count()
?– 計數 -
std()
?– 標準差 -
agg()
?– 自定義聚合(可同時計算多個統計量)
(1)基本聚合操作
import pandas as pd# 示例 DataFrame
df = pd.DataFrame({'Category': ['A', 'B', 'A', 'B', 'A'],'Value': [10, 20, 30, 40, 50]
})# 按 'Category' 分組并計算均值
grouped = df.groupby('Category').mean()
print(grouped)輸出:
Category Value
A 30
B 30
(2)agg()
?多聚合計算
# 同時計算多個統計量
result = df.groupby('Category').agg({'Value': ['sum', 'mean', 'max']
})
print(result)輸出:
Category sum mean max
A 90 30 50
B 60 30 40
(3)apply()
?自定義聚合
# 自定義聚合函數
def custom_agg(x):return x.max() - x.min()result = df.groupby('Category')['Value'].apply(custom_agg)
print(result)輸出:
Category
A 40
B 20
Name: Value, dtype: int64
(二)級聯函數操作(Chaining)
級聯是指將多個 DataFrame 或 Series 沿某個軸(行或列)拼接在一起。主要使用:
-
pd.concat()
?– 通用拼接 -
append()
?– 追加行(已棄用,推薦用?concat
)
(1)pd.concat()
?基本使用
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})# 默認按行(axis=0)拼接
result = pd.concat([df1, df2])
print(result)輸出:A B
0 1 3
1 2 4
0 5 7
1 6 8
(2)按列拼接(axis=1
)
result = pd.concat([df1, df2], axis=1)
print(result)輸出:A B A B
0 1 3 5 7
1 2 4 6 8
(3)ignore_index=True
?重置索引
result = pd.concat([df1, df2], ignore_index=True)
print(result)輸出:A B
0 1 3
1 2 4
2 5 7
3 6 8
(4)append()
(不推薦,建議用?concat
)
# 追加行(已棄用,推薦用 concat)
result = df1.append(df2, ignore_index=True)
print(result)
(三)聚合 vs. 級聯對比
操作 | 主要函數 | 用途 |
---|---|---|
聚合 | groupby() ,?agg() ,?sum() ,?mean() | 數據分組計算統計量 |
級聯 | pd.concat() ,?append() | 合并多個 DataFrame |
總結
操作 | 適用場景 | 關鍵函數 |
---|---|---|
聚合 | 分組計算統計量 | groupby() ,?agg() ,?sum() ,?mean() |
級聯 | 合并多個 DataFrame | pd.concat() ,?append() (不推薦) |
四、Pandas畫圖?
在 Pandas 中,可以直接使用?DataFrame.plot()
?和?Series.plot()
?進行數據可視化,底層基于?Matplotlib,但語法更簡潔。
1、基本繪圖方法
Pandas 支持多種圖表類型,通過?kind
?參數指定:
-
line
?– 折線圖(默認) -
bar
?/?barh
?– 柱狀圖 / 橫向柱狀圖 -
hist
?– 直方圖 -
box
?– 箱線圖 -
pie
?– 餅圖 -
scatter
?– 散點圖 -
area
?– 面積圖
如:DataFrame
import pandas as pd
import numpy as npdf = pd.DataFrame({'A': np.random.rand(10),'B': np.random.rand(10),'C': np.random.rand(10)
}, index=pd.date_range('2023-01-01', periods=10))
2、常見圖表
(1) 折線圖(kind='line'
)
df.plot(kind='line', title='Line Plot', figsize=(8, 4))
(2) 柱狀圖(kind='bar'
)
df.head(5).plot(kind='bar', title='Bar Plot', figsize=(8, 4))
(3) 橫向柱狀圖(kind='barh'
)
df.head(3).plot(kind='barh', title='Horizontal Bar Plot')
(4) 直方圖(kind='hist'
)
df['A'].plot(kind='hist', bins=5, title='Histogram')
(5) 箱線圖(kind='box'
)
df.plot(kind='box', title='Box Plot')
(6) 餅圖(kind='pie'
)
df['A'].head(5).plot(kind='pie', autopct='%.1f%%', title='Pie Chart')
(7) 散點圖(kind='scatter'
)
df.plot(kind='scatter', x='A', y='B', title='Scatter Plot')
3、自定義圖表樣式
(1) 調整大小、顏色、標題
df.plot(kind='line',figsize=(10, 5),title='Customized Plot',color=['red', 'green', 'blue'],linewidth=2,alpha=0.7 # 透明度
)
(2) 添加網格、圖例、坐標軸標簽
ax = df.plot(kind='bar')
ax.grid(True, linestyle='--') # 網格線
ax.set_xlabel('Date') # X軸標簽
ax.set_ylabel('Value') # Y軸標簽
ax.legend(loc='upper right') # 圖例位置
(3) 子圖(多個圖表并列)
df.plot(kind='line',subplots=True, # 每個列一個子圖layout=(2, 2), # 2行2列figsize=(10, 8)
)
4、直接使用 Matplotlib 增強功能
Pandas 繪圖返回的是 Matplotlib 的?Axes
?對象,可以進一步自定義:
import matplotlib.pyplot as pltax = df.plot(kind='bar')
ax.set_title('Enhanced Plot')
plt.xticks(rotation=45) # 旋轉X軸標簽
plt.tight_layout() # 自動調整布局
plt.show()
5、保存圖表
ax = df.plot(kind='line')
ax.figure.savefig('plot.png', dpi=300, bbox_inches='tight') # 保存為PNG
總結
功能 | 方法 | 示例 |
---|---|---|
折線圖 | df.plot(kind='line') | 趨勢分析 |
柱狀圖 | df.plot(kind='bar') | 分類對比 |
直方圖 | df['col'].plot(kind='hist') | 分布查看 |
箱線圖 | df.plot(kind='box') | 離群值檢測 |
餅圖 | df['col'].plot(kind='pie') | 占比分析 |
散點圖 | df.plot(kind='scatter', x='A', y='B') | 相關性分析 |
保存圖表 | ax.figure.savefig('file.png') | 導出圖片 |
Pandas 繪圖適合快速探索數據,如需更復雜可視化,可結合 Matplotlib 或 Seaborn!