Python數(shù)據(jù)處理工具之Pandas的使用詳細(xì)指南
一、前言
1.1 什么是Pandas?
Pandas 是Python中最流行的數(shù)據(jù)處理和分析庫之一,它提供了高效、靈活且易于使用的數(shù)據(jù)結(jié)構(gòu),使得數(shù)據(jù)清洗、分析和處理變得簡單直觀。Pandas的名字來源于"Panel Data"(面板數(shù)據(jù))和"Python Data Analysis"(Python數(shù)據(jù)分析)的組合。
Pandas最初由Wes McKinney于2008年開發(fā),現(xiàn)已成為數(shù)據(jù)科學(xué)領(lǐng)域的標(biāo)準(zhǔn)工具之一,廣泛應(yīng)用于金融、統(tǒng)計、社會科學(xué)和許多工程領(lǐng)域。
下面是Pandas的使用與相關(guān)接口進行介紹,很多接口的參數(shù)較多與復(fù)雜,這里只對部分進行解釋,感興趣的話可以去看官方文檔:pandas documentation
1.2 安裝Pandas
在開始使用Pandas之前,需要先安裝它。直接通過pip安裝即可:
pip install pandas # 如果使用Anaconda發(fā)行版 conda install pandas
二、Pandas 數(shù)據(jù)相關(guān)
2.1 Pandas核心數(shù)據(jù)結(jié)構(gòu)
Pandas有兩個主要的數(shù)據(jù)結(jié)構(gòu):Series和DataFrame。
Series
Series是一維的標(biāo)簽化數(shù)組,可以保存任何數(shù)據(jù)類型(整數(shù)、字符串、浮點數(shù)、Python對象等)。
import pandas as pd # 創(chuàng)建一個Series s = pd.Series([1, 3, 5, 7, 9]) print(s)
輸出結(jié)果:
0 1
1 3
2 5
3 7
4 9
dtype: int64
DataFrame
DataFrame是一個二維的標(biāo)簽化數(shù)據(jù)結(jié)構(gòu),可以看作是由多個Series組成的字典。
# 創(chuàng)建一個DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'City': ['New York', 'Paris', 'London', 'Tokyo']
}
df = pd.DataFrame(data)
print(df)
輸出結(jié)果:
Name Age City
0 Alice 25 New York
1 Bob 30 Paris
2 Charlie 35 London
3 David 40 Tokyo
2.2 數(shù)據(jù)讀取與寫入
Pandas支持多種數(shù)據(jù)格式的讀寫操作:
# 讀取CSV文件
df = pd.read_csv('data.csv')
# 讀取Excel文件
df = pd.read_excel('data.xlsx')
# 讀取JSON文件
df = pd.read_json('data.json')
# 寫入CSV文件
df.to_csv('output.csv', index=False)
# 寫入Excel文件
df.to_excel('output.xlsx', index=False)
2.3 數(shù)據(jù)探索與清洗
查看數(shù)據(jù)
df.head()
df.head(n=5) # n: 要顯示的前n行,默認(rèn)為5
df.tail()
df.tail(n=5) # n: 要顯示的后n行,默認(rèn)為5
df.info()
df.info(verbose=None, buf=None, max_cols=None, memory_usage=None, show_counts=None) # 查看數(shù)據(jù)的基本信息
- 參數(shù)
verbose:如果為True,則打印完整的列信息。如果為False,則打印簡要的列信息。默認(rèn)為None,即自動選擇。 - 參數(shù)
buf:輸出的目標(biāo),可以是None(默認(rèn)),表示輸出到控制臺;也可以指定一個文件對象,將輸出寫入該文件。 - 參數(shù)
max_cols:指定顯示的最大列數(shù),默認(rèn)為None,即顯示所有列。 - 參數(shù)
memory_usage:是否顯示內(nèi)存使用情況。默認(rèn)為None,即自動選擇。 - 參數(shù)
show_counts:是否顯示每列非空值的數(shù)量,默認(rèn)為None,即自動選擇。
df.describe()
df.describe(percentiles=None, include=None, exclude=None) # 查看數(shù)據(jù)的統(tǒng)計摘要
- 參數(shù)
percentiles:指定需要計算的百分位數(shù)。它是一個列表,默認(rèn)計算常見的25%、50%(中位數(shù))和75%百分位數(shù)。 - 參數(shù)
include:指定要計算統(tǒng)計摘要的列類型??梢允?None(默認(rèn)),表示所有列,或者指定如['object'](僅包括對象類型列)等類型。 - 參數(shù)
exclude:指定不包含的列類型。默認(rèn)是None,表示不排除任何列。
處理缺失值
# 檢查缺失值 df.isnull().sum() # 刪除包含缺失值的行 df.dropna() # 填充缺失值 df.fillna(value)
數(shù)據(jù)篩選
# 選擇單列 df['column_name'] # 選擇多列 df[['col1', 'col2']] # 條件篩選 df[df['Age'] > 30] # 使用loc和iloc df.loc[row_indexer, column_indexer] df.iloc[row_position, column_position]
2.4 數(shù)據(jù)操作
1. 排序:
df.sort_values

df.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None) # 對數(shù)據(jù)進行排序
- 參數(shù)
by:指定排序的列或列的列表??梢允菃蝹€列名(如'Age')或者多個列名組成的列表(如['Age', 'Name'])。 - 參數(shù)
axis:指定排序的軸。默認(rèn)值為0,表示對行進行排序;如果設(shè)置為1,則表示對列進行排序。 - 參數(shù)
ascending:控制排序順序。默認(rèn)為True,表示升序排列;False則表示降序排列。如果by為多個列名,可以傳入一個布爾列表,指定每列的排序順序。 - 參數(shù)
inplace:是否在原 DataFrame 上進行修改。默認(rèn)為False,返回排序后的新 DataFrame;如果設(shè)置為True,則直接在原 DataFrame 上進行排序。 - 參數(shù)
kind:指定排序算法。默認(rèn)為'quicksort',還可以選擇'mergesort'或'heapsort'等。 - 參數(shù)
na_position:指定缺失值的位置。默認(rèn)值為'last',表示缺失值排在最后;可以設(shè)置為'first',表示缺失值排在最前面。 - 參數(shù)
ignore_index:是否重新生成索引。默認(rèn)為False,保留原有索引;設(shè)置為True時,會重新生成連續(xù)的整數(shù)索引。 - 參數(shù)
key:傳入一個函數(shù),用于對排序列進行轉(zhuǎn)換。例如,key=str.lower會先將字符串列轉(zhuǎn)換為小寫字母后再排序。
代碼示例
假設(shè)有一個名為 df 的 DataFrame,其中包含了員工的姓名、年齡和薪水信息:
import pandas as pd
# 創(chuàng)建示例 DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 28],
'Salary': [50000, 60000, 55000, 80000, 75000]
}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
'''
輸出:
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 55000
3 David 40 80000
4 Eve 28 75000
'''
示例 1:按 Age 列升序排序
df_sorted = df.sort_values(by='Age', ascending=True)
print("\n按 Age 升序排序:")
print(df_sorted)
輸出:
Name Age Salary
0 Alice 25 50000
4 Eve 28 75000
1 Bob 30 60000
2 Charlie 35 55000
3 David 40 80000
2. 分組
df.groupby

df.groupby(by, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, dropna=True) # 對數(shù)據(jù)進行分組
- 參數(shù)
by:指定用于分組的列名、列的列表或者字典。可以是單個列(如'Age'),多個列(如['Age', 'Gender'])或列名稱到列值的映射(如{'Region': 'Country'})。 - 參數(shù)
axis:指定要分組的軸,默認(rèn)為0,表示對行進行分組;如果為1,則表示對列進行分組。 - 參數(shù)
level:針對層次化索引(MultiIndex)進行分組,指定要按哪個層級進行分組,默認(rèn)為None,表示按所有列進行分組。 - 參數(shù)
as_index:控制是否將分組的列作為返回 DataFrame 的索引。默認(rèn)為True,即分組列成為索引;如果為False,分組列會作為普通列返回。 - 參數(shù)
sort:是否按分組鍵進行排序。默認(rèn)為True,表示按分組鍵排序;如果為False,則按原始順序返回分組。 - 參數(shù)
group_keys:是否保留分組鍵。默認(rèn)為True,即會保留分組鍵作為結(jié)果的一部分;如果為False,則只返回結(jié)果。 - 參數(shù)
squeeze:如果分組結(jié)果是單列或單行,是否返回一個 Series 而不是 DataFrame。默認(rèn)為False。 - 參數(shù)
observed:在分組時,是否僅考慮實際出現(xiàn)的類別。默認(rèn)為False,即包括所有類別;如果為True,則僅包括在數(shù)據(jù)中實際出現(xiàn)的類別。 - 參數(shù)
dropna:是否排除缺失值。默認(rèn)為True,即排除缺失值所在的組;如果為False,則保留缺失值所在的組。
groupby 允許我們根據(jù)某些列的值對數(shù)據(jù)進行分組,然后對每個組進行聚合操作(如求平均值、求和等)。可以對分組后的數(shù)據(jù)執(zhí)行多種統(tǒng)計操作,非常靈活。
代碼示例
假設(shè)有一個名為 df 的 DataFrame,包含員工的部門和薪水信息,想要按部門計算薪水的平均值:
import pandas as pd
# 創(chuàng)建示例 DataFrame
data = {
'Department': ['HR', 'Engineering', 'Engineering', 'HR', 'Sales'],
'Salary': [50000, 70000, 75000, 52000, 60000]
}
df = pd.DataFrame(data)
# 按部門進行分組,并計算薪水的平均值
grouped = df.groupby('Department')['Salary'].mean()
print(grouped)
輸出:
Department
Engineering 72500.0
HR 51000.0
Sales 60000.0
Name: Salary, dtype: float64
在這個示例中,我們使用 groupby 按 Department 列進行分組,并計算每個部門的平均薪水。
3. 合并數(shù)據(jù)
pd.concat

pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)
- 參數(shù)
objs:一個可迭代的對象(如列表、元組等),包含多個 DataFrame 或 Series 要合并的對象。 - 參數(shù)
axis:指定沿著哪個軸進行合并。默認(rèn)為0,表示按行合并(垂直拼接);如果為1,表示按列合并(水平拼接)。 - 參數(shù)
join:指定合并時的連接方式。'outer'(默認(rèn))表示并集;'inner'表示交集,只保留兩個 DataFrame 都有的索引/列。 - 參數(shù)
ignore_index:是否重置索引。默認(rèn)為False,即保留原索引;如果為True,則會重新生成索引。 - 參數(shù)
keys:用于在合并的結(jié)果中創(chuàng)建層次化索引,可以傳入一個序列來為每個 DataFrame 指定一個鍵。 - 參數(shù)
levels:指定層次化索引的級別。 - 參數(shù)
names:指定層次化索引的名稱。 - 參數(shù)
verify_integrity:是否檢查合并后的數(shù)據(jù)是否存在重復(fù)的索引。默認(rèn)為False,即不檢查;如果為True,會拋出錯誤。 - 參數(shù)
sort:合并時是否對列進行排序。默認(rèn)為False,即不排序;如果為True,則會按字母順序排序。 - 參數(shù)
copy:是否復(fù)制數(shù)據(jù)。默認(rèn)為True,即復(fù)制數(shù)據(jù);如果為False,則會盡量避免復(fù)制數(shù)據(jù)。
使用示例:按行合并 DataFrame
import pandas as pd
# 創(chuàng)建示例 DataFrame
data1 = {
'Name': ['Alice', 'Bob'],
'Age': [25, 30]
}
data2 = {
'Name': ['Charlie', 'David'],
'Age': [35, 40]
}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
# 合并兩個 DataFrame(按行合并)
result = pd.concat([df1, df2], ignore_index=True)
print(result)
輸出:
Name Age
0 Alice 25
1 Bob 30
2 Charlie 35
3 David 40
在此示例中,df1 和 df2 被按行合并,且重置了索引。
pd.merge

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
- 參數(shù)
left和right:要合并的兩個 DataFrame。 - 參數(shù)
how:指定合并的方式。常見的選項有:
'inner'(默認(rèn)):取交集,只保留在兩個 DataFrame 中都存在的行。'outer':取并集,保留兩個 DataFrame 中所有的行。'left':只保留左側(cè) DataFrame 中的行。'right':只保留右側(cè) DataFrame 中的行。
- 參數(shù)
on:指定合并時的列名,默認(rèn)為None,表示在兩個 DataFrame 中都有的列名上進行合并。 - 參數(shù)
left_on和right_on:指定分別用于左側(cè)和右側(cè) DataFrame 合并的列名。如果on為None,可以通過這兩個參數(shù)單獨指定。 - 參數(shù)
left_index和right_index:是否使用索引進行合并。默認(rèn)為False,如果為True,則使用索引進行合并。 - 參數(shù)
sort:是否對合并后的數(shù)據(jù)按鍵進行排序。默認(rèn)為True,即按鍵排序;如果為False,則不排序。 - 參數(shù)
suffixes:為重復(fù)列添加后綴。默認(rèn)為('_x', '_y')。 - 參數(shù)
indicator:是否添加一列指示信息,顯示每行數(shù)據(jù)來自哪個 DataFrame。默認(rèn)為False,如果為True,會添加一個名為_merge的列。 - 參數(shù)
validate:用于數(shù)據(jù)完整性檢查的參數(shù),常見選項有'one_to_one','one_to_many','many_to_one','many_to_many'。
使用示例:SQL風(fēng)格的合并
import pandas as pd
# 創(chuàng)建示例 DataFrame
data1 = {
'ID': [1, 2, 3],
'Name': ['Alice', 'Bob', 'Charlie']
}
data2 = {
'ID': [2, 3, 4],
'Salary': [50000, 60000, 70000]
}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
# 按 'ID' 列合并兩個 DataFrame(內(nèi)連接)
result = pd.merge(df1, df2, on='ID', how='inner')
print(result)
輸出:
ID Name Salary
0 2 Bob 50000
1 3 Charlie 60000
在這個例子中,df1 和 df2 按照 ID 列進行 SQL 風(fēng)格的合并,只保留在兩個 DataFrame 中都存在的 ID 值。
4. 應(yīng)用函數(shù)
series.apply

Series.apply(func, convert_dtype=True, args=(), **kwds)
- 參數(shù)
func:要應(yīng)用到每個元素的函數(shù)(或函數(shù)名)。在這個例子中,lambda x: x * 2是將每個Age列的元素都乘以 2。 - 參數(shù)
convert_dtype:是否轉(zhuǎn)換返回的結(jié)果類型。默認(rèn)為True,即轉(zhuǎn)換為適當(dāng)?shù)念愋?;如果?False,則保留原始類型。 - 參數(shù)
args:傳遞給func的額外位置參數(shù)。 - 參數(shù)
**kwds:傳遞給func的額外關(guān)鍵字參數(shù)。
使用示例:將Age列的值乘以 2
import pandas as pd
# 創(chuàng)建示例 DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'Weight': [55, 65, 75]
}
df = pd.DataFrame(data)
# 使用 apply 將 Age 列的每個元素乘以 2
df['Age_doubled'] = df['Age'].apply(lambda x: x * 2)
print(df)
輸出:
Name Age Weight Age_doubled
0 Alice 25 55 50
1 Bob 30 65 60
2 Charlie 35 75 70
在這個例子中,我們使用 apply 對 Age 列的每個元素應(yīng)用了 lambda x: x * 2 的函數(shù),使得每個 Age 值都被乘以了 2。
df.apply

DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwds)
- 參數(shù)
func:要應(yīng)用的函數(shù)(或函數(shù)名)。在這個例子中,lambda row: row['Age'] * row['Weight']是對每一行執(zhí)行計算,即將Age和Weight兩列相乘。 - 參數(shù)
axis:指定操作的軸。axis=0表示按列應(yīng)用函數(shù)(默認(rèn));axis=1表示按行應(yīng)用函數(shù)。在這個例子中,axis=1使得我們在每行上應(yīng)用函數(shù)。 - 參數(shù)
raw:是否傳遞原始數(shù)據(jù)給函數(shù)。如果為True,則傳遞原始數(shù)組給函數(shù),而不是 Series。 - 參數(shù)
result_type:指定返回結(jié)果的類型??梢允?expand(展開為 DataFrame),reduce(返回 Series),或者broadcast(廣播到原始 DataFrame 形狀)。 - 參數(shù)
args:傳遞給func的額外位置參數(shù)。 - 參數(shù)
**kwds:傳遞給func的額外關(guān)鍵字參數(shù)。
使用示例:按行計算Age和Weight的乘積
import pandas as pd
# 創(chuàng)建示例 DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'Weight': [55, 65, 75]
}
df = pd.DataFrame(data)
# 使用 apply 對每行進行計算,得到 Age 和 Weight 的乘積
df['Age_Weight'] = df.apply(lambda row: row['Age'] * row['Weight'], axis=1)
print(df)
輸出:
Name Age Weight Age_Weight
0 Alice 25 55 1375
1 Bob 30 65 1950
2 Charlie 35 75 2625
在這個例子中,我們使用 apply 對每一行應(yīng)用了 lambda row: row['Age'] * row['Weight'] 的函數(shù),使得每行的 Age 和 Weight 列的乘積被計算并添加為新的一列 Age_Weight。
2.5 時間序列處理
Pandas對時間序列數(shù)據(jù)有出色的支持:
# 創(chuàng)建時間序列
date_rng = pd.date_range(start='1/1/2020', end='1/08/2020', freq='D')
# 設(shè)置索引為日期
df.set_index('date_column', inplace=True)
# 重采樣
df.resample('M').mean()
2.6 數(shù)據(jù)可視化
Pandas集成了Matplotlib,可以輕松繪制圖表:
# 線圖 df.plot() # 柱狀圖 df.plot.bar() # 直方圖 df['Age'].plot.hist() # 箱線圖 df.plot.box()
2.7 性能優(yōu)化技巧
- 使用適當(dāng)?shù)臄?shù)據(jù)類型(如category類型用于分類變量)
- 避免循環(huán),使用向量化操作
- 使用query()方法進行高效查詢
- 對于大型數(shù)據(jù)集,考慮使用Dask或Modin等擴展庫
三、代碼示例
示例1:銷售數(shù)據(jù)分析
# 讀取銷售數(shù)據(jù)
sales = pd.read_csv('sales_data.csv')
# 計算每月銷售額
sales['date'] = pd.to_datetime(sales['date'])
monthly_sales = sales.resample('M', on='date')['amount'].sum()
# 可視化
monthly_sales.plot(title='Monthly Sales')
示例2:客戶細(xì)分
# 創(chuàng)建RFM指標(biāo)
snapshot_date = max(df['InvoiceDate']) + pd.Timedelta(days=1)
rfm = df.groupby('CustomerID').agg({
'InvoiceDate': lambda x: (snapshot_date - x.max()).days,
'InvoiceNo': 'count',
'TotalPrice': 'sum'
})
# 重命名列
rfm.rename(columns={
'InvoiceDate': 'Recency',
'InvoiceNo': 'Frequency',
'TotalPrice': 'MonetaryValue'
}, inplace=True)
以上就是Python數(shù)據(jù)處理工具之Pandas的使用詳細(xì)指南的詳細(xì)內(nèi)容,更多關(guān)于Python Pandas數(shù)據(jù)處理的資料請關(guān)注腳本之家其它相關(guān)文章!
- Python Pandas實現(xiàn)刪除指定行/列數(shù)據(jù)
- Python?Pandas讀取Excel數(shù)據(jù)并查看數(shù)據(jù)特征的常見方法詳解
- Python數(shù)據(jù)可視化之Pandas、Matplotlib與Seaborn的高效實戰(zhàn)指南
- Python使用Pandas快速找出重復(fù)數(shù)據(jù)并生成清理報告
- Python Pandas大數(shù)據(jù)處理性能優(yōu)化技巧(百萬級數(shù)據(jù)提速)
- 一文帶你掌握Python Pandas數(shù)據(jù)處理的三大實用技巧
- Python?Pandas使用merge函數(shù)進行數(shù)據(jù)合并的操作代碼
相關(guān)文章
Python如何將bmp格式的圖片批量轉(zhuǎn)成jpg
這篇文章主要介紹了Python如何將bmp格式的圖片批量轉(zhuǎn)成jpg問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
python求numpy中array按列非零元素的平均值案例
這篇文章主要介紹了python求numpy中array按列非零元素的平均值案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

