Python?Pandas庫(kù)簡(jiǎn)介及一些常見用法總結(jié)
一、 Pandas簡(jiǎn)介
1. 簡(jiǎn)介
Pandas是一個(gè)開源的Python數(shù)據(jù)分析庫(kù),它提供了高性能、易用的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具。Pandas的名字來(lái)源于“Panel Data”(面板數(shù)據(jù)),它主要用于處理結(jié)構(gòu)化數(shù)據(jù),例如表格數(shù)據(jù)、時(shí)間序列數(shù)據(jù)等。Pandas是在NumPy庫(kù)的基礎(chǔ)上構(gòu)建的,它繼承了NumPy的高性能數(shù)組計(jì)算能力,并在此基礎(chǔ)上增加了對(duì)復(fù)雜數(shù)據(jù)操作的支持。它提供了兩種主要的數(shù)據(jù)結(jié)構(gòu):Series(一維數(shù)組)和DataFrame(二維表格),使得數(shù)據(jù)處理更加高效和便捷。
Pandas最初由Wes McKinney在2008年創(chuàng)建,目的是為了滿足金融數(shù)據(jù)分析的需求。隨著時(shí)間的推移,它已經(jīng)成為Python數(shù)據(jù)分析生態(tài)系統(tǒng)中不可或缺的一部分,被廣泛應(yīng)用于數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、金融、統(tǒng)計(jì)等多個(gè)領(lǐng)域。
2. 主要特點(diǎn)
(一)強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)
- DataFrame:這是Pandas中最核心的數(shù)據(jù)結(jié)構(gòu)之一,它是一個(gè)二維表格型數(shù)據(jù)結(jié)構(gòu),類似于Excel中的表格。DataFrame的每一列可以存儲(chǔ)不同類型的數(shù)據(jù)(如數(shù)字、字符串等),并且可以通過(guò)列名和行索引來(lái)訪問數(shù)據(jù)。例如,我們可以創(chuàng)建一個(gè)包含員工信息(姓名、年齡、部門等)的DataFrame,通過(guò)列名“姓名”來(lái)獲取所有員工的名字,或者通過(guò)行索引來(lái)獲取特定員工的全部信息。
- Series:Series是一個(gè)一維數(shù)組,類似于NumPy數(shù)組,但它可以帶有索引。索引可以是整數(shù)、字符串等任何哈希類型。Series在處理單列數(shù)據(jù)時(shí)非常方便,比如對(duì)一組時(shí)間序列數(shù)據(jù)(如股票價(jià)格)進(jìn)行操作,可以通過(guò)日期索引來(lái)快速訪問特定時(shí)間點(diǎn)的價(jià)格。
(二)靈活的數(shù)據(jù)操作
- 數(shù)據(jù)清洗:Pandas提供了豐富的數(shù)據(jù)清洗功能,可以輕松處理缺失值(如填充缺失值、刪除缺失值)、重復(fù)數(shù)據(jù)(如刪除重復(fù)行)、異常值等。例如,對(duì)于一個(gè)包含缺失值的DataFrame,我們可以使用fillna()方法來(lái)填充缺失值,或者使用dropna()方法來(lái)刪除包含缺失值的行。
- 數(shù)據(jù)篩選:可以使用布爾索引、標(biāo)簽索引、位置索引等多種方式對(duì)數(shù)據(jù)進(jìn)行篩選。例如,我們可以通過(guò)布爾表達(dá)式df[df[‘年齡’] > 30]來(lái)篩選出年齡大于30的員工數(shù)據(jù)。
- 數(shù)據(jù)合并:Pandas支持多種數(shù)據(jù)合并操作,如concat()(用于連接多個(gè)數(shù)據(jù)結(jié)構(gòu))、merge()(類似于SQL中的JOIN操作,可以根據(jù)指定的鍵將兩個(gè)DataFrame合并在一起)和join()(基于索引進(jìn)行合并)。這些功能使得在處理多個(gè)數(shù)據(jù)源時(shí)可以方便地將它們整合到一起。比如,將員工信息表和員工績(jī)效表根據(jù)員工ID進(jìn)行合并。
- 數(shù)據(jù)分組與聚合:通過(guò)groupby()方法可以對(duì)數(shù)據(jù)進(jìn)行分組,然后對(duì)每個(gè)分組應(yīng)用聚合函數(shù)(如求和、求平均、計(jì)數(shù)等)。例如,對(duì)銷售數(shù)據(jù)按照地區(qū)分組,然后計(jì)算每個(gè)地區(qū)的總銷售額。
(三)時(shí)間序列分析支持
Pandas對(duì)時(shí)間序列數(shù)據(jù)提供了強(qiáng)大的支持。它可以直接解析日期時(shí)間字符串,生成時(shí)間序列索引。例如,pd.date_range(start=‘2024-01-01’, end=‘2024-12-31’, freq=‘D’)可以生成一個(gè)從2024年1月1日到2024年12月31日的每日時(shí)間序列索引。此外,Pandas還支持時(shí)間頻率的轉(zhuǎn)換(如將日數(shù)據(jù)轉(zhuǎn)換為月數(shù)據(jù))、時(shí)間窗口計(jì)算(如計(jì)算移動(dòng)平均值)等操作,這使得它在金融數(shù)據(jù)分析、氣象數(shù)據(jù)分析等涉及時(shí)間序列的領(lǐng)域非常有用。
(四)與其他庫(kù)的兼容性
Pandas可以無(wú)縫地與Python的其他數(shù)據(jù)分析和科學(xué)計(jì)算庫(kù)配合使用。例如,它可以與NumPy進(jìn)行高效的數(shù)組操作,與Matplotlib進(jìn)行數(shù)據(jù)可視化,與Scikit - learn進(jìn)行機(jī)器學(xué)習(xí)模型的訓(xùn)練和預(yù)測(cè)。這種良好的兼容性使得Pandas能夠融入完整的數(shù)據(jù)分析工作流中。
3.應(yīng)用場(chǎng)景
(一)金融領(lǐng)域
在金融數(shù)據(jù)分析中,Pandas可以用來(lái)處理股票價(jià)格數(shù)據(jù)、交易數(shù)據(jù)等。例如,通過(guò)讀取股票價(jià)格的時(shí)間序列數(shù)據(jù),可以計(jì)算股票的收益率、移動(dòng)平均線等指標(biāo)。還可以對(duì)多個(gè)股票的收益率數(shù)據(jù)進(jìn)行合并,分析股票之間的相關(guān)性。此外,Pandas也可以用于風(fēng)險(xiǎn)管理,比如通過(guò)分析交易數(shù)據(jù)來(lái)識(shí)別異常交易行為。
(二)數(shù)據(jù)科學(xué)與機(jī)器學(xué)習(xí)
在數(shù)據(jù)科學(xué)項(xiàng)目中,Pandas是數(shù)據(jù)預(yù)處理的重要工具。數(shù)據(jù)科學(xué)家可以使用Pandas來(lái)加載數(shù)據(jù)(如從CSV文件、數(shù)據(jù)庫(kù)等來(lái)源加載)、清洗數(shù)據(jù)(處理缺失值、異常值等)、探索數(shù)據(jù)(計(jì)算描述性統(tǒng)計(jì)量、繪制數(shù)據(jù)分布圖等)。在機(jī)器學(xué)習(xí)中,Pandas可以將數(shù)據(jù)集劃分為訓(xùn)練集和測(cè)試集,還可以對(duì)特征數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化、歸一化等操作,為機(jī)器學(xué)習(xí)模型的訓(xùn)練做好準(zhǔn)備。
(三)商業(yè)數(shù)據(jù)分析
商業(yè)分析師可以使用Pandas來(lái)分析銷售數(shù)據(jù)、客戶數(shù)據(jù)等。例如,通過(guò)分析銷售數(shù)據(jù)的時(shí)間序列,可以發(fā)現(xiàn)銷售的季節(jié)性規(guī)律;通過(guò)分析客戶數(shù)據(jù),可以對(duì)客戶進(jìn)行分群(如使用groupby()方法根據(jù)客戶消費(fèi)金額分組),并計(jì)算每個(gè)客戶群的特征(如平均消費(fèi)金額、購(gòu)買頻率等)。這些分析結(jié)果可以幫助企業(yè)制定營(yíng)銷策略、優(yōu)化產(chǎn)品布局等。
(四)生物醫(yī)學(xué)研究
在生物醫(yī)學(xué)領(lǐng)域,Pandas可以用于處理實(shí)驗(yàn)數(shù)據(jù),如基因表達(dá)數(shù)據(jù)、臨床試驗(yàn)數(shù)據(jù)等。研究人員可以使用Pandas來(lái)整理數(shù)據(jù)格式、篩選特定的樣本或基因,還可以對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析,如計(jì)算基因表達(dá)的差異等。
二、Pandas庫(kù)的常見用法
1. 數(shù)據(jù)讀取
1.1 讀取CSV文件
Pandas加載CSV文件并在 Python 中以編程方式操作它。 Pandas的核心是“DataFrame”的對(duì)象類型- 本質(zhì)上是一個(gè)值表,每行和每列都有一個(gè)標(biāo)簽。用read_csv()方法加載CSV 文件:
import pandas as pd
# 讀取CSV文件
df = pd.read_csv('2010-2024年國(guó)家經(jīng)濟(jì)運(yùn)行情況.csv',encoding='utf-8')
# 顯示前5行數(shù)據(jù)
print(df.head())
1.2 讀取Excel文件
- 使用pd.read_excel()方法可以讀取Excel文件(.xls或.xlsx格式)。
import pandas as pd
# 讀取Excel文件
df = pd.read_excel('2010-2024年北京市經(jīng)濟(jì)運(yùn)行情況.xlsx',encoding='gbk')
# 顯示前5行數(shù)據(jù)
print(df.head())
1.3 讀取數(shù)據(jù)庫(kù)數(shù)據(jù)
- 使用pd.read_sql()方法可以從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)。
import pandas as pd
import sqlite3
# 連接到SQLite數(shù)據(jù)庫(kù)
conn = sqlite3.connect('economics_data.db')
# 從數(shù)據(jù)庫(kù)表中讀取數(shù)據(jù)
df = pd.read_sql('SELECT * FROM table_name', conn)
1.4 讀取JSON數(shù)據(jù)
- 使用pd.read_json()方法可以讀取JSON格式的文件。
import pandas as pd
df = pd.read_json("2025年北京報(bào)告數(shù)據(jù).json", orient="records")
參數(shù):
- orient:指定JSON文件的格式,常見的有’records’(每行是一個(gè)JSON對(duì)象)、‘split’(鍵值對(duì)分開存儲(chǔ))等。
- ‘records’:JSON 是一個(gè)記錄列表,每個(gè)記錄是一個(gè)字典,這是默認(rèn)值。
- ‘index’:JSON 的鍵是索引,值是列。
- ‘columns’:JSON 的鍵是列,值是索引。
- ‘values’:JSON 是一個(gè)二維數(shù)組,每一行是一個(gè)記錄。
import pandas as pd
# 示例 JSON 數(shù)據(jù)
json_data = {
"index": ["row1", "row2"],
"columns": ["col1", "col2"],
"data": [[1, 2], [3, 4]]
}
# 使用 orient='split' 讀取
df = pd.read_json(pd.io.json.dumps(json_data), orient='split')
print(df)
2. 寫入數(shù)據(jù)
2.1 寫入CSV文件
- 使用DataFrame.to_csv()方法可以將DataFrame保存為CSV文件。
import pandas as pd
# 創(chuàng)建一個(gè) DataFrame
data = {
'name': ['Alice', 'Bob'],
'age': [25, 30]
}
df = pd.DataFrame(data)
# 將數(shù)據(jù)寫入CSV文件
# index=False表示不保存行索引
df.to_csv('output.csv', index=False)
參數(shù)說(shuō)明:
- index:是否保存行索引,默認(rèn)為True。
- sep:指定分隔符,默認(rèn)為逗號(hào)(,)。
2.2 寫入Excel文件
- 使用DataFrame.to_excel()方法可以將DataFrame保存為Excel文件。
import pandas as pd
# 創(chuàng)建一個(gè) DataFrame
data = {
'name': ['Alice', 'Bob', 'Gary', 'Lily'],
'age': [25, 30, 24, 26],
'Grade': [97, 76, 61, 88]
}
df = pd.DataFrame(data)
# 寫入Excel文件中
df.to_excel('exam_result.xlsx', sheet_name='Sheet1', index=False)
參數(shù)說(shuō)明:
- sheet_name:指定保存的工作表名稱。
- index:是否保存行索引。
2.3 寫入數(shù)據(jù)庫(kù)
- 使用DataFrame.to_sql()方法可以將DataFrame保存到數(shù)據(jù)庫(kù)中。
import pandas as pd
from sqlalchemy import create_engine
# 創(chuàng)建一個(gè) DataFrame
data = {
'name': ['Alice', 'Bob', 'Gary', 'Lily'],
'age': [25, 30, 24, 26],
‘gender': ['F', 'M', 'M', 'F'],
'Grade': [97, 76, 61, 88]
}
df = pd.DataFrame(data)
# 創(chuàng)建sqlalchemy的數(shù)據(jù)庫(kù)連接
conn = create_engine('mysql+pymysql://root:123456@localhost:3306/exam_db?charset=utf8')
# 寫入數(shù)據(jù)庫(kù)中
df.to_sql('exam_result', conn, if_exists='replace', index=False)
參數(shù)說(shuō)明:
- 第一個(gè)參數(shù)是目標(biāo)數(shù)據(jù)庫(kù)表的名稱。
- conn是數(shù)據(jù)庫(kù)連接對(duì)象, 必須是sqlalchemy的數(shù)據(jù)庫(kù)連接。
- if_exists:指定如果表已存在時(shí)的行為,可選值為’fail’(拋出錯(cuò)誤)、‘replace’(替換表)、‘append’(追加數(shù)據(jù))。
index:是否將行索引作為一列保存到數(shù)據(jù)庫(kù)中。
3. 數(shù)據(jù)清洗
3.1 處理缺失值
(1)檢查缺失值
- 使用isnull()或isna()方法可以檢查數(shù)據(jù)中的缺失值。
# 返回一個(gè)布爾型DataFrame,缺失值為True print(df.isnull()) # 統(tǒng)計(jì)每列的缺失值數(shù)量 print(df.isnull().sum())
(2)填充缺失值
- 使用fillna()方法可以填充缺失值。
# 將所有缺失值填充為0 df.fillna(value=0, inplace=True) # 用列的均值填充該列的缺失值 df['列名'].fillna(value=df['列名'].mean(), inplace=True)
(3)刪除缺失值
- 使用dropna()方法可以刪除包含缺失值的行或列。
# 刪除包含缺失值的行 df.dropna(inplace=True) # 刪除包含缺失值的列 df.dropna(axis=1, inplace=True)
3.2 處理重復(fù)數(shù)據(jù)
(1)檢查重復(fù)數(shù)據(jù)
- 使用duplicated()方法可以檢查重復(fù)行。
# 返回布爾型Series,重復(fù)行為True print(df.duplicated()) # 統(tǒng)計(jì)重復(fù)行的數(shù)量 print(df.duplicated().sum())
(2)刪除重復(fù)數(shù)據(jù)
- 使用drop_duplicates()方法可以刪除重復(fù)行。
# 刪除重復(fù)行 df.drop_duplicates(inplace=True)
3.3 數(shù)據(jù)類型轉(zhuǎn)換
- 使用astype()方法可以將列的數(shù)據(jù)類型轉(zhuǎn)換為指定類型。
# 將列轉(zhuǎn)換為整數(shù)類型
df['列名'] = df['列名'].astype('int')
# 將列轉(zhuǎn)換為浮點(diǎn)數(shù)類型
df['列名'] = df['列名'].astype('float')
# 將列轉(zhuǎn)換為字符串類型
df['列名'] = df['列名'].astype('str')
3.4 重命名列名
- 使用rename()方法可以重命名列名。
- 用法:
df.rename(columns={‘舊列名1’: ‘新列名1’, ‘舊列名2’: ‘新列名2’}, inplace=True)
stock_data_frame = pd.DataFrame(stock_data).rename(
columns={
0: 'SECURITY_CODE',
1: 'SECURITY_NAME',
2: 'LATEST_PRICE',
3: 'PRICES_CHANGE_RATIO',
4: 'PRICES_CHANGE',
5: 'TRADING_COUNT',
6: 'TRADING_VALUE',
7: 'AMPLITUDE',
8: 'TURN_OVER_RATIO',
9: 'PE_RATIO',
10: 'TRADE_RATIO',
11: 'MAX_PRICE',
12: 'MIN_PRICE',
13: 'OPEN_PRICE',
14: 'PRE_CLOSE_PRICE',
15: 'TOTAL_MARKET_VALUE',
16: 'CIRCULATION_MARKET_VALUE',
17: 'PB_RATIO',
18: 'PE_RATIO_TTM',
19: 'UPWARD_RATE',
20: 'MONTH_CHANGE_RATIO',
21: 'YEAR_CHANGE_RATIO',
22: 'INFLOW_FUNDS'
}
)
示例:當(dāng)前我們有一個(gè)包含缺失值和重復(fù)值的國(guó)家經(jīng)濟(jì)運(yùn)行情況CSV文件,需要進(jìn)一步清洗數(shù)據(jù)以便后續(xù)分析。
import pandas as pd
# 讀取數(shù)據(jù)
data = pd.read_csv('2010-2024年國(guó)家經(jīng)濟(jì)運(yùn)行情況.csv',encoding='utf-8')
# 顯示前五行數(shù)據(jù)
print(data.head())
# 處理缺失值
# 處理1:刪除含有缺失值的行
data = data.dropna()
# 處理方式2:將缺失值填充為0
data = data.fillna(0)
# 移除重復(fù)值
data = data.drop_duplicates()
# 顯示處理后數(shù)據(jù)的前5條
print(data.head())
4. 數(shù)據(jù)查看與統(tǒng)計(jì)
4.1 查看數(shù)據(jù)結(jié)構(gòu)
(1)查看DataFrame的前幾行
- 使用head()方法可以查看DataFrame的前幾行,默認(rèn)顯示前5行。
# 查看前5行 print(df.head()) # 查看前10行 print(df.head(10))
(2)查看DataFrame的后幾行
- 使用tail()方法可以查看DataFrame的后幾行,默認(rèn)顯示后5行。
# 查看后5行 print(df.tail()) # 查看后10行 print(df.tail(10))
(3)查看DataFrame的行列數(shù)(形狀)
- 使用shape屬性可以獲取DataFrame的形狀(行數(shù)和列數(shù))。
# 輸出行數(shù)與列數(shù) print(df.shape)
(4)查看DataFrame的列名
- 使用columns屬性可以獲取DataFrame的列名。
# 輸出列名 print(df.columns)
(5)查看DataFrame的數(shù)據(jù)類型
- 使用dtypes屬性可以查看每列的數(shù)據(jù)類型。
# 輸出列的數(shù)據(jù)類型 print(df.dbtypes)
4.2 數(shù)據(jù)統(tǒng)計(jì)
(1)描述性統(tǒng)計(jì)
- 使用**describe()**方法可以獲取DataFrame的描述性統(tǒng)計(jì)信息,包括均值、標(biāo)準(zhǔn)差、最小值、四分位數(shù)等。
# 默認(rèn)只對(duì)數(shù)值列進(jìn)行統(tǒng)計(jì) print(df.describe()) # 對(duì)所有列進(jìn)行統(tǒng)計(jì) print(df.describe(include='all'))
(2)特定統(tǒng)計(jì)量計(jì)算
- 可以使用mean()、median()、std()、sum()、count()等方法計(jì)算特定的統(tǒng)計(jì)量。
- mean() : 統(tǒng)計(jì)均值
- median(): 統(tǒng)計(jì)中位數(shù)
- std(): 統(tǒng)計(jì)標(biāo)準(zhǔn)差
- sum(): 數(shù)據(jù)求和統(tǒng)計(jì)
- count(): 統(tǒng)計(jì)數(shù)量
# 計(jì)算某一列的均值 df['列名'].mean() # 計(jì)算某一列的總和 df['列名'].sum()
(3)計(jì)算相關(guān)系數(shù)
- 使用**corr()**方法可以計(jì)算DataFrame中數(shù)值列之間的相關(guān)系數(shù)。
# 輸出相關(guān)系數(shù)矩陣 print(df.corr())
- 示例:
import pandas as pd
import numpy as np
# 創(chuàng)建一個(gè)示例 DataFrame
data = {
'A': np.random.randn(100), # 隨機(jī)生成100個(gè)標(biāo)準(zhǔn)正態(tài)分布的數(shù)
'B': np.random.rand(100), # 隨機(jī)生成100個(gè)在[0,1)區(qū)間均勻分布的數(shù)
'C': np.random.randint(0, 100, 100), # 隨機(jī)生成10個(gè)[0,10)之間的整數(shù)
'D': np.random.randn(100) # 隨機(jī)生成100個(gè)標(biāo)準(zhǔn)正態(tài)分布的數(shù)
}
df = pd.DataFrame(data)
# 計(jì)算 DataFrame 中所有數(shù)值型列的相關(guān)系數(shù)
correlation_matrix = df.corr()
print("Correlation Matrix:")
print(correlation_matrix)
(4)計(jì)算數(shù)據(jù)分布
- 使用value_counts()方法可以統(tǒng)計(jì)某一列中各個(gè)值的出現(xiàn)次數(shù)。
# 統(tǒng)計(jì)某一列中各個(gè)值的出現(xiàn)次數(shù) print(df['列名'].value_counts())
5. 數(shù)據(jù)篩選與過(guò)濾
5.1 通過(guò)布爾表達(dá)式篩選
- Pandas支持使用布爾表達(dá)式可以對(duì)DataFrame進(jìn)行篩選。
# 篩選某一列大于10的行 filtered_df = df[df['列名'] > 10] # 使用多個(gè)條件進(jìn)行篩選 filtered_df = df[(df['列名1'] > 10) & (df['列名2'] < 20)]
- 示例:根據(jù)條件篩選股票
# 條件選股邏輯:
# - 量比 > 1
# - 換手率 ≥5%且≤10%
# - 振幅 ≥3%且≤10%
# - 流通市值 ≥50億且≤200億
# - 動(dòng)態(tài)市盈率>0且<= 30(行業(yè)均值×1.5)
# - 資金流 > 500萬(wàn)
filtered = stock_data_frame[
# 量比 > 1
(stock_data_frame['TRADE_RATIO'] > 100) &
# 換手率在5%至10%區(qū)間
(stock_data_frame['TURN_OVER_RATIO'] >= 500) &
(stock_data_frame['TURN_OVER_RATIO'] <= 1000) &
# 振幅在3%至10%區(qū)間
(stock_data_frame['AMPLITUDE'] >= 300) &
(stock_data_frame['AMPLITUDE'] <= 1000) &
# 流通市值在50億元至200億元區(qū)間
(stock_data_frame['CIRCULATION_MARKET_VALUE'] >= 5000000000) &
(stock_data_frame['CIRCULATION_MARKET_VALUE'] <= 20000000000) &
# 動(dòng)態(tài)市盈率在0至40之間
(stock_data_frame['PE_RATIO'] > 0) &
(stock_data_frame['PE_RATIO'] <= 4000) &
# 股票收盤價(jià)在30元以內(nèi)
(stock_data_frame['LATEST_PRICE'] <= 3000) &
# 當(dāng)日資金流入大于500萬(wàn)
(stock_data_frame['INFLOW_FUNDS'] > 5000000)
]
5.2 按索引篩選
- Pandas中使用loc()和iloc()可以按索引進(jìn)行篩選。
- loc:基于標(biāo)簽索引,可以同時(shí)指定行和列。
- iloc:基于位置索引,只能指定行和列的位置。
# 使用loc # 選擇第2到第5行,指定列名 selected_df = df.loc[df.index[1:5], ['列名1', '列名2']] # 使用iloc # 選擇第2到第5行,第1和第2列 selected_df = df.iloc[1:5, [0, 1]]
5.3 按列名篩選
- Pandas中可以通過(guò)列名直接選擇列。
# 選擇單列 selected_column = df['列名'] # 選擇多列 selected_columns = df[['列名1', '列名2']]
6. 數(shù)據(jù)轉(zhuǎn)換與處理
6.1 數(shù)據(jù)排序
(1)按列值排序
- 使用sort_values()方法可以按列值對(duì)DataFrame進(jìn)行排序。
# 按某一列升序排序 df.sort_values(by='列名', ascending=True, inplace=True) # 按多列排序 df.sort_values(by=['列名1', '列名2'], ascending=[True, False], inplace=True)
(2)按索引排序
- 使用sort_index()方法可以按索引對(duì)DataFrame進(jìn)行排序。
# 按索引排序 df.sort_index(inplace=True)
6.2 數(shù)據(jù)分組與聚合
(1)數(shù)據(jù)分組
- Pandas中使用groupby()方法可以對(duì)數(shù)據(jù)進(jìn)行分組。
# 按某一列分組
grouped = df.groupby('列名')
# 按多列分組
grouped = df.groupby(['列名1', '列名2'])
(2)數(shù)據(jù)聚合
- Pandas中使用聚合函數(shù)(如sum()、mean()、count()等)對(duì)分組后的數(shù)據(jù)進(jìn)行計(jì)算。
# 對(duì)分組后的數(shù)據(jù)求和
result = grouped.sum()
# 對(duì)分組后的數(shù)據(jù)求均值
result = grouped.mean()
# 對(duì)不同列應(yīng)用不同的聚合函數(shù)
result = grouped.agg({'列名1': 'sum', '列名2': 'mean'})
6.3 數(shù)據(jù)透視表
(1)數(shù)據(jù)重塑
- Pandas中使用pivot()用于將長(zhǎng)格式數(shù)據(jù)轉(zhuǎn)換為寬格式。
import pandas as pd
import numpy as np
# 創(chuàng)建示例數(shù)據(jù)
data = {
'日期': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02'],
'變量': ['A', 'B', 'A', 'B'],
'值': [10, 20, 30, 40]
}
df = pd.DataFrame(data)
# 使用pivot進(jìn)行重塑
pivot_df = df.pivot(index='日期', columns='變量', values='值')
print("Pivot結(jié)果:\n", pivot_df)
輸出:

參數(shù)說(shuō)明:
- index: 指定作為行索引的列
- columns: 指定作為列名的列
- values: 指定填充值的列
(2)數(shù)據(jù)透視
- Pandas中使用pivot_table()方法可以創(chuàng)建數(shù)據(jù)透視表。
pivot_table = df.pivot_table(index='列名1', columns='列名2', values='列名3', aggfunc='sum')
# 創(chuàng)建有重復(fù)值的數(shù)據(jù)
data = {
'日期': ['2024-01-01', '2024-01-01', '2024-01-02', '2024-01-02'],
'變量': ['A', 'B', 'A', 'B'],
'值': [10, 20, 30, 40]
}
df = pd.DataFrame(data)
# 使用pivot_table進(jìn)行聚合
pivot_table_df = pd.pivot_table(df, values='值', index='日期', columns='變量', aggfunc=np.mean)
print("\nPivot Table結(jié)果:\n", pivot_table_df)
輸出:

參數(shù)說(shuō)明:
- aggfunc: 指定聚合函數(shù),默認(rèn)為np.mean
- 可以處理重復(fù)值,對(duì)相同索引和列的組合進(jìn)行聚合
7. 數(shù)據(jù)合并與連接
7.1 數(shù)據(jù)合并
- Pandas中使用merge()方法可以將兩個(gè)DataFrame按指定的鍵合并,類似于SQL中的JOIN操作。
df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value1': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['A', 'B', 'D'], 'value2': [4, 5, 6]})
# 內(nèi)連接合并
merged_df = pd.merge(df1, df2, on='key', how='inner')
# 外連接合并
merged_df = pd.merge(df1, df2, on='key', how='outer')
# 左連接合并
merged_df = pd.merge(df1, df2, on='key', how='left')
# 右連接合并
merged_df = pd.merge(df1, df2, on='key', how='right')
輸出結(jié)果:

7.2 數(shù)據(jù)連接
- Pandas中使用concat()方法可以將多個(gè)DataFrame按行或列連接。
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
# 按行連接
concatenated_df = pd.concat([df1, df2], axis=0)
# 按列連接
concatenated_df = pd.concat([df1, df2], axis=1)
輸出結(jié)果:

8. 時(shí)間序列數(shù)據(jù)處理
8.1 創(chuàng)建時(shí)間序列
- 使用pd.date_range()可以創(chuàng)建時(shí)間序列索引。
# 每日時(shí)間序列
date_range = pd.date_range(start='2024-01-01', end='2024-12-31', freq='D')
# 創(chuàng)建一個(gè)時(shí)間序列DataFrame
df = pd.DataFrame({'value': range(len(date_range))}, index=date_range)
8.2 時(shí)間頻率轉(zhuǎn)換
- 使用resample()方法可以對(duì)時(shí)間序列數(shù)據(jù)進(jìn)行頻率轉(zhuǎn)換。
# 將日數(shù)據(jù)轉(zhuǎn)換為月數(shù)據(jù),并求和
monthly_df = df.resample('M').sum()
8.3 時(shí)間窗口計(jì)算
- 使用rolling()方法可以對(duì)時(shí)間序列數(shù)據(jù)進(jìn)行窗口計(jì)算(如移動(dòng)平均)。
# 計(jì)算7天移動(dòng)平均值 df['moving_avg'] = df['value'].rolling(window=7).mean()
在股票行情計(jì)算時(shí),可使用rolling()方法計(jì)算MA移動(dòng)平均線。
# 計(jì)算移動(dòng)平均線 stock_data['ma5'] = stock_data['close'].rolling(5).mean() stock_data['ma10'] = stock_data['close'].rolling(10).mean() stock_data['ma20'] = stock_data['close'].rolling(20).mean()
總結(jié)
到此這篇關(guān)于Python Pandas庫(kù)簡(jiǎn)介及一些常見用法的文章就介紹到這了,更多相關(guān)Python Pandas庫(kù)用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python twilio模塊實(shí)現(xiàn)發(fā)送手機(jī)短信功能
這篇文章主要介紹了python twilio模塊實(shí)現(xiàn)發(fā)送手機(jī)短信的功能,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
使用Rasterio讀取柵格數(shù)據(jù)的實(shí)例講解
今天小編就為大家分享一篇使用Rasterio讀取柵格數(shù)據(jù)的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
Python?中?Selenium?的?send_keys()?函數(shù)用法小結(jié)
send_keys() 是將數(shù)字、文本和符號(hào)等鍵盤輸入發(fā)送到應(yīng)用程序的文本框的過(guò)程, send_keys() 是 WebDriver 的一部分,每個(gè)鍵盤輸入都會(huì)發(fā)送到此元素,這篇文章主要介紹了Python?中?Selenium?的?send_keys()?函數(shù),需要的朋友可以參考下2023-11-11
Python使用CRC32實(shí)現(xiàn)校驗(yàn)文件
CRC文件校驗(yàn)是一種用于驗(yàn)證文件完整性的方法,通過(guò)計(jì)算文件的CRC值并與預(yù)先計(jì)算的CRC校驗(yàn)值進(jìn)行比較,來(lái)判斷文件是否發(fā)生變化,本文我們就來(lái)介紹一下Python如何利用CRC32實(shí)現(xiàn)校驗(yàn)文件吧2023-10-10
python機(jī)器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)(一)
這篇文章主要為大家詳細(xì)介紹了python機(jī)器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)第一篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
python如何實(shí)現(xiàn)convolution neural network卷積神經(jīng)網(wǎng)絡(luò)算法
卷積神經(jīng)網(wǎng)絡(luò)(CNN)是深度學(xué)習(xí)中重要的算法之一,主要應(yīng)用于圖像識(shí)別和處理領(lǐng)域,其基本原理是模擬人類視覺系統(tǒng),通過(guò)卷積層、激活函數(shù)和池化層等組件提取圖像的特征,并通過(guò)全連接層進(jìn)行分類或其他任務(wù),CNN訓(xùn)練過(guò)程中使用大量標(biāo)記圖像數(shù)據(jù)2024-10-10
Python辦公自動(dòng)化之文件的比較合并與xml操作
這篇文章主要為大家詳細(xì)介紹了Python辦公自動(dòng)化之文件的比較合并與xml文件操作的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),需要的可以參考一下2023-12-12

