你還在用Excel處理數(shù)據(jù)?Python Pandas讓你處理數(shù)據(jù)事半功倍!
簡(jiǎn)介
Pandas是一個(gè)用于數(shù)據(jù)分析和處理的Python庫(kù),它提供了高效的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作工具,可以處理多種類(lèi)型的數(shù)據(jù),包括時(shí)間序列、表格型數(shù)據(jù)和矩陣數(shù)據(jù)等。
Pandas的主要數(shù)據(jù)結(jié)構(gòu)是Series和DataFrame,Series是一維數(shù)組,DataFrame是二維表格型數(shù)據(jù)結(jié)構(gòu),類(lèi)似于Excel中的表格。Pandas還提供了一些常用的數(shù)據(jù)操作函數(shù),包括數(shù)據(jù)的讀取和寫(xiě)入、數(shù)據(jù)的切片和過(guò)濾、數(shù)據(jù)的合并和聚合等。
本文將深入介紹Pandas庫(kù)的使用,包括數(shù)據(jù)的讀取和寫(xiě)入、數(shù)據(jù)的索引和切片、數(shù)據(jù)的過(guò)濾和排序、數(shù)據(jù)的合并和聚合等常用操作。同時(shí),還將介紹一些不常用但是有用的Pandas函數(shù)和技巧。本文將提供完整的代碼示例,幫助讀者更好地理解和應(yīng)用Pandas庫(kù)。
安裝
在使用Pandas庫(kù)之前,需要先安裝它??梢允褂胮ip命令進(jìn)行安裝:
pip install pandas
數(shù)據(jù)的讀取和寫(xiě)入
Pandas提供了多種方式讀取和寫(xiě)入數(shù)據(jù),包括讀寫(xiě)CSV文件、Excel文件、SQL數(shù)據(jù)庫(kù)等。下面是一些常用的數(shù)據(jù)讀取和寫(xiě)入函數(shù)。
讀取CSV文件
Pandas提供了read_csv函數(shù)用于讀取CSV文件,該函數(shù)將CSV文件讀取為DataFrame格式的數(shù)據(jù)。
import pandas as pd
df = pd.read_csv('data.csv')
print(df)
read_csv函數(shù)的參數(shù)列表如下:
- filepath_or_buffer:CSV文件路徑或URL地址。
- sep:CSV文件的分隔符,默認(rèn)為逗號(hào)。
- header:指定哪一行作為列名,默認(rèn)為0,即第一行。
- index_col:指定哪一列作為行索引,默認(rèn)為None,即不使用行索引。
- usecols:指定讀取哪些列,默認(rèn)為None,即讀取所有列。
- dtype:指定每一列的數(shù)據(jù)類(lèi)型。
- skiprows:指定跳過(guò)哪些行。
- nrows:指定讀取的行數(shù)。
- na_values:指定缺失值的表示方式。
寫(xiě)入CSV文件
Pandas提供了to_csv函數(shù)用于將數(shù)據(jù)寫(xiě)入CSV文件。
import pandas as pd
df = pd.DataFrame({'name':['Tom', 'Jack', 'Mary'], 'age':[18, 20, 22]})
df.to_csv('data.csv', index=False)
to_csv函數(shù)的參數(shù)列表如下:
- path_or_buf:CSV文件路徑或文件對(duì)象。
- sep:CSV文件的分隔符,默認(rèn)為逗號(hào)。
- header:是否寫(xiě)入列名,默認(rèn)為T(mén)rue。
- index:是否寫(xiě)入行索引,默認(rèn)為T(mén)rue。
- mode:寫(xiě)入模式,如"w"表示覆蓋寫(xiě)入,"a"表示追加寫(xiě)入。
- encoding:編碼方式,默認(rèn)為"utf-8"。
- na_rep:缺失值的表示方式。
讀取Excel文件
Pandas提供了read_excel函數(shù)用于讀取Excel文件,該函數(shù)將Excel文件讀取為DataFrame格式的數(shù)據(jù)。
import pandas as pd
df = pd.read_excel('data.xlsx')
print(df)
read_excel函數(shù)的參數(shù)列表如下:
- io:Excel文件路徑或URL地址。
- sheet_name:指定讀取哪個(gè)Sheet,默認(rèn)為0,即第一個(gè)Sheet。
- header:指定哪一行作為列名,默認(rèn)為0,即第一行。
- index_col:指定哪一列作為行索引,默認(rèn)為None,即不使用行索引。
- usecols:指定讀取哪些列,默認(rèn)為None,即讀取所有列。
- dtype:指定每一列的數(shù)據(jù)類(lèi)型。
- skiprows:指定跳過(guò)哪些行。
- nrows:指定讀取的行數(shù)。
- na_values:指定缺失值的表示方式。
寫(xiě)入Excel文件
Pandas提供了to_excel函數(shù)用于將數(shù)據(jù)寫(xiě)入Excel文件。
import pandas as pd
df = pd.DataFrame({'name':['Tom', 'Jack', 'Mary'], 'age':[18, 20, 22]})
df.to_excel('data.xlsx', index=False)
to_excel函數(shù)的參數(shù)列表如下:
- excel_writer:Excel文件路徑或文件對(duì)象。
- sheet_name:指定寫(xiě)入哪個(gè)Sheet,默認(rèn)為Sheet1。
- header:是否寫(xiě)入列名,默認(rèn)為T(mén)rue。
- index:是否寫(xiě)入行索引,默認(rèn)為T(mén)rue。
- startrow:從哪一行開(kāi)始寫(xiě)入,默認(rèn)為0。
- startcol:從哪一列開(kāi)始寫(xiě)入,默認(rèn)為0。
- na_rep:缺失值的表示方式。
數(shù)據(jù)的索引和切片
Pandas提供了多種方式對(duì)數(shù)據(jù)進(jìn)行索引和切片,包括基于位置的索引和切片、基于標(biāo)簽的索引和切片、布爾索引和掩碼索引等。
基于位置的索引和切片
Pandas提供了類(lèi)似于Python列表的索引和切片方式,使用iloc屬性實(shí)現(xiàn)。
import pandas as pd
df = pd.DataFrame({'name':['Tom', 'Jack', 'Mary'], 'age':[18, 20, 22]})
print(df.iloc[1]) # 索引第二行
print(df.iloc[0:2]) # 切片前兩行
print(df.iloc[:, 0]) # 索引第一列
print(df.iloc[:, 0:2]) # 切片前兩列
print(df.iloc[1, 1]) # 索引第二行第二列
基于標(biāo)簽的索引和切片
Pandas提供了基于標(biāo)簽的索引和切片方式,使用loc屬性實(shí)現(xiàn)。
import pandas as pd
df = pd.DataFrame({'name':['Tom', 'Jack', 'Mary'], 'age':[18, 20, 22]})
df.set_index('name', inplace=True) # 將name列設(shè)置為行索引
print(df.loc['Jack']) # 索引Jack行
print(df.loc[['Tom', 'Mary']]) # 索引Tom和Mary行
print(df.loc[:, 'age']) # 索引age列
print(df.loc[:, ['age', 'gender']]) # 索引age和gender列
print(df.loc['Jack', 'age']) # 索引Jack行的age列
布爾索引和掩碼索引
Pandas提供了布爾索引和掩碼索引方式,可以根據(jù)指定的條件篩選數(shù)據(jù)。
import pandas as pd
df = pd.DataFrame({'name':['Tom', 'Jack', 'Mary'], 'age':[18, 20, 22]})
print(df[df['age']>20]) # 篩選年齡大于20的數(shù)據(jù)
print(df[(df['name']=='Tom') | (df['name']=='Mary')]) # 篩選名字為T(mén)om或Mary的數(shù)據(jù)
數(shù)據(jù)的過(guò)濾和排序
Pandas提供了多種方式對(duì)數(shù)據(jù)進(jìn)行過(guò)濾和排序,包括條件過(guò)濾、數(shù)值過(guò)濾、文本過(guò)濾和排序等。
條件過(guò)濾
Pandas提供了query函數(shù)和where函數(shù)用于條件過(guò)濾。
import pandas as pd
df = pd.DataFrame({'name':['Tom', 'Jack', 'Mary'], 'age':[18, 20, 22]})
print(df.query('age > 20')) # 篩選年齡大于20的數(shù)據(jù)
print(df.where(df['name']=='Tom')) # 篩選名字為T(mén)om的數(shù)據(jù)
數(shù)值過(guò)濾
Pandas提供了多種方式對(duì)數(shù)據(jù)進(jìn)行數(shù)值過(guò)濾,包括數(shù)值比較、數(shù)值范圍篩選和缺失值處理等。
import pandas as pd
import numpy as np
df = pd.DataFrame({'name':['Tom', 'Jack', 'Mary'], 'age':[18, np.nan, 22]})
print(df[df['age']>20]) # 篩選年齡大于20的數(shù)據(jù)
print(df[df['age'].between(18, 20)]) # 篩選年齡在18-20之間的數(shù)據(jù)
print(df.dropna()) # 刪除缺失值
print(df.fillna(0)) # 將缺失值填充為0
文本過(guò)濾
Pandas提供了str屬性用于文本過(guò)濾,可以根據(jù)指定的條件篩選包含特定字符的數(shù)據(jù)。
import pandas as pd
df = pd.DataFrame({'name':['Tom', 'Jack', 'Mary'], 'gender':['M', 'F', 'F']})
print(df[df['name'].str.contains('a')]) # 篩選名字中包含a的數(shù)據(jù)
print(df[df['gender'].isin(['M', 'F'])]) # 篩選性別為M或F的數(shù)據(jù)
排序
Pandas提供了sort_values函數(shù)用于對(duì)數(shù)據(jù)進(jìn)行排序,可以根據(jù)指定的列或行進(jìn)行排序。
import pandas as pd
df = pd.DataFrame({'name':['Tom', 'Jack', 'Mary'], 'age':[18, 20, 22]})
print(df.sort_values(by='age', ascending=False)) # 按年齡降序排序
sort_values函數(shù)的參數(shù)列表如下:
- by:指定按哪一列排序。
- axis:指定按哪一個(gè)維度排序,默認(rèn)為0,即按列排序。
- ascending:指定是否升序排列,默認(rèn)為T(mén)rue。
數(shù)據(jù)的合并和聚合
Pandas提供了多種方式對(duì)數(shù)據(jù)進(jìn)行合并和聚合,包括表格拼接、數(shù)據(jù)合并和數(shù)據(jù)聚合等。
表格拼接
Pandas提供了concat函數(shù)用于對(duì)多個(gè)表格進(jìn)行拼接,可以按行或列拼接。
import pandas as pd
df1 = pd.DataFrame({'name':['Tom', 'Jack'], 'age':[18, 20]})
df2 = pd.DataFrame({'name':['Mary'], 'age':[22]})
print(pd.concat([df1, df2])) # 按行拼接
df3 = pd.DataFrame({'gender':['M', 'M', 'F']})
print(pd.concat([df1, df3], axis=1)) # 按列拼接
concat函數(shù)的參數(shù)列表如下:
- objs:需要拼接的表格列表。
- axis:指定按哪一個(gè)維度拼接,默認(rèn)為0,即按行拼接。
- join:指定拼接方式,默認(rèn)為"outer",即保留所有數(shù)據(jù)。
- keys:指定拼接后每個(gè)表格的標(biāo)識(shí)符。
數(shù)據(jù)合并
Pandas提供了merge函數(shù)用于對(duì)多個(gè)數(shù)據(jù)進(jìn)行合并,可以按指定的列進(jìn)行合并。
import pandas as pd
df1 = pd.DataFrame({'name':['Tom', 'Jack'], 'age':[18, 20], 'gender':['M', 'M']})
df2 = pd.DataFrame({'name':['Tom', 'Mary'], 'score':[80, 90]})
print(pd.merge(df1, df2, on='name')) # 按名字合并
merge函數(shù)的參數(shù)列表如下:
- left:左側(cè)數(shù)據(jù)表。
- right:右側(cè)數(shù)據(jù)表。
- on:指定按哪一列進(jìn)行合并。
- how:指定合并方式,如"inner"表示保留兩個(gè)表格中都有的數(shù)據(jù)。
- suffixes:指定重復(fù)列名的后綴。
數(shù)據(jù)聚合
Pandas提供了groupby函數(shù)用于對(duì)數(shù)據(jù)進(jìn)行聚合操作,可以根據(jù)指定的列進(jìn)行分組。
import pandas as pd
df = pd.DataFrame({'name':['Tom', 'Jack', 'Mary', 'Tom'], 'age':[18, 20, 22, 24]})
print(df.groupby('name').mean()) # 按名字分組并計(jì)算平均值
groupby函數(shù)的參數(shù)列表如下:
- by:指定按哪一列進(jìn)行分組。
- axis:指定按哪一個(gè)維度分組,默認(rèn)為0,即按列分組。
- as_index:指定是否以分組列作為行索引,默認(rèn)為T(mén)rue。
- aggfunc:指定聚合函數(shù),默認(rèn)為"mean",即計(jì)算平均值。
其他技巧
除了上述介紹的常用操作和函數(shù)外,Pandas還提供了許多不常用但是有用的函數(shù)和技巧,下面介紹其中一些。
apply函數(shù)
apply函數(shù)可以對(duì)每一列或每一行應(yīng)用指定的函數(shù)。
import pandas as pd
import numpy as np
df = pd.DataFrame({'name':['Tom', 'Jack', 'Mary'], 'age':[18, 20, 22]})
print(df.apply(lambda x: x.max())) # 每列的最大值
print(df.apply(lambda x: np.mean(x), axis=1)) # 每行的平均值
pivot_table函數(shù)
pivot_table函數(shù)可以對(duì)數(shù)據(jù)進(jìn)行透視表操作,可以根據(jù)指定的列進(jìn)行分組和聚合。
import pandas as pd
df = pd.DataFrame({'name':['Tom', 'Jack', 'Mary', 'Tom'], 'age':[18, 20, 22, 24], 'score':[80, 90, 85, 95]})
print(df.pivot_table(values='score', index='name', aggfunc='mean')) # 按名字計(jì)算平均分?jǐn)?shù)
cut函數(shù)
cut函數(shù)可以將數(shù)據(jù)按指定的區(qū)間進(jìn)行分段。
import pandas as pd
df = pd.DataFrame({'score':[60, 70, 80, 90, 100]})
bins = [0, 60, 70, 80, 90, 100]
labels = ['F', 'D', 'C', 'B', 'A']
df['grade'] = pd.cut(df['score'], bins=bins, labels=labels)
print(df)
qcut函數(shù)
qcut函數(shù)可以將數(shù)據(jù)按指定的分位數(shù)進(jìn)行分段。
import pandas as pd
df = pd.DataFrame({'score':[60, 70, 80, 90, 100]})
df['grade'] = pd.qcut(df['score'], q=3, labels=['Low', 'Medium', 'High'])
print(df)
結(jié)論
Pandas是Python中非常常用的數(shù)據(jù)處理工具,可以方便地進(jìn)行數(shù)據(jù)的讀取、清洗、轉(zhuǎn)換、分析和可視化等操作。本文介紹了Pandas的基本用法和常用函數(shù),以及一些高級(jí)技巧,希望能夠?qū)ψx者有所幫助。