Pandas基礎使用指南之排序、字符串日期處理和文件合并拆分技巧
之前我們已經介紹了 pandas的基礎使用用法,這一期我們來看看這個包其他有意思的方法
一、排序
1.1 對Series排序
對Series的排序,主要是兩個參數,一個是ascending,代表是否升序排列,另一個就是很熟悉的inplace 了
sr = pd.Series([2,3,8,4,5]) sr.sort_values(ascending=False,inplace=True) # 降序排序,同時替換原有DataFrame print(sr)
輸出的結果為,注意排序后index的順序也會跟著變:
2 8
4 5
3 4
1 3
0 2
dtype: int64
1.2 對DataFrame排序
由于DataFrame是二維的,因此排序時多了一個參數by,表示按照哪一列進行排序,同時ascending也支持布爾數組,實現多條件的排序,如下:
df = pd.DataFrame({"A":["B","A","B","B","A"],
"B":[2,3,8,4,5],
"C":[11,2,7,4,5]})
# 單條件排序
df.sort_values(by="B",ascending=True,inplace=True)
print(df)
單條件的排序結果為:
A B C
0 B 2 11
1 A 3 2
3 B 4 4
4 A 5 5
2 B 8 7
而對于多條件排序,by和ascending一一對應,代表應該是升序還是降序
# 多條件排序 df.sort_values(by=["A","B"],ascending=[False,True],inplace=True) print(df)
多條件排序輸出結果如下,首先按照A列降序排序,然后按照B列升序排序,所以有一個主次的關系:
A B C
0 B 2 11
3 B 4 4
2 B 8 7
1 A 3 2
4 A 5 5
二、字符串和日期處理
對于字符串的處理,我們一般都使用str進行,而對于日期,我們用dt,直接通過底下的代碼我們來看
df = pd.DataFrame({"姓名":["張三","李四","王五","趙六","王二"],
"出生日期":["2000-01-01","2001-02-02","2002-03-03","2003-04-04","2004-05-05"],
"分數":["90分","29分","78分","46分","57分"]})
print(df.dtypes)
print("="*30)
df["出生日期"] = pd.to_datetime(df["出生日期"]) # 轉換為日期類型
print(df["出生日期"].dtype) # datetime64[ns]
# df["出生日期"] = df["出生日期"].str.replace("1","") # 錯誤用法,str只能為字符串服務
df["出生日期"] = df["出生日期"].dt.strftime("%Y-%m-%d") # 轉換為字符串類型
print(df["出生日期"].dtype) # object
df["分數"] = df["分數"].str.replace("分","").astype(int) # 轉換為整數類型
print(df)
輸出如下,我們一個一個做分析,首先我們定義了一個DataFrame,可以發(fā)現初始都是字符串,因此輸出為object,然后我們通過to_datetime將其改成了標準的日期格式,因此輸出為datetime64[ns],同樣我們也可以通過dt.strftime將其轉換為字符串格式,對于字符串格式,我們可以使用str下的若干方法進行處理,上述演示中只是將“分”這個字刪除,并轉換為整型:
姓名 object
出生日期 object
分數 object
dtype: object
==============================
datetime64[ns]
object
姓名 出生日期 分數
0 張三 2000-01-01 90
1 李四 2001-02-02 29
2 王五 2002-03-03 78
3 趙六 2003-04-04 46
4 王二 2004-05-05 57
同時pandas嚴格約定str只服務于字符串,如果對其他格式使用,則會報錯,對于字符串的處理,還有一個很強大的工具就是正則表達式,我們同樣可以使用正則表達式進行處理,但是注意使用regex=True告訴程序這個是正則表達式:
# 常規(guī)復雜的三步替換
df["出生日期"] = df["出生日期"].str.replace("年","").str.replace("月","").str.replace("日","")
# 正則表達式替換
df["出生日期"] = df["出生日期"].str.replace("[年月日]","",regex=True)
三、DataFrame的連接
如果需要做DataFrame的連接,我們常常使用concat方法,其重要的三個參數分別是
axis=0代表按行連接,否則是按列連接ignore_index=True表示重新生成一個新的索引,否則保留原始索引join="outer"表示保留所有非重復字段,join="inner"則表示只保留重合字段
df1 = pd.DataFrame({"A":[1,2,3],
"B":[6,7,8]})
df2 = pd.DataFrame({"B":[4,5,6],
"F":[9,10,11]})
print(pd.concat([df1,df2],axis=1))
print(pd.concat([df1,df2],axis=0,ignore_index=True,join="outer"))
輸出結果為:
A B B F
0 1 6 4 9
1 2 7 5 10
2 3 8 6 11
A B F
0 1.0 6 NaN
1 2.0 7 NaN
2 3.0 8 NaN
3 NaN 4 9.0
4 NaN 5 10.0
5 NaN 6 11.0
在輸出中,如果 ignore_index=False ,左側就是原始索引 [0,1,2,0,1,2],而如果使用join="inner"則只會保留重合的B列
同時Concat還支持DataFrame 與Series的混合拼接,例如:
sr1 = pd.Series([1,2,3],name="sr1") sr2 = pd.Series([6,7,8,],name="sr2") print(pd.concat([sr1,df1,df2,sr2],axis=1)) # 混合拼接
輸出結果為:
sr1 A B B F sr2
0 1 1 6 4 9 6
1 2 2 7 5 10 7
2 3 3 8 6 11 8
四、EXCEL表格批量合并和拆分
4.1 批量進行表格合并
之前我們已經學習了那么多的pandas使用技巧,那么接下來我們就看看上面講到的比如Concat在實際過程中有什么用吧,比如我們先看一下批量的合并,既然要合并,不過就是DataFrame的拼接,在某個文件夾下有若干個xlsx文件,我們需要合并到一張表里,這些子表的表頭都是相同的:

那么我們通過下面的程序進行合并,首先獲取文件夾下所有的xlsx文件,然后讀取DataFrame,緊接著添加一個標識列,代表從哪個數據表中拿到的,最后合并并保存,在這里Concat就起到了將各個DataFrame合并在一起的功能
son_file_path = r"C:\Users\22330\Desktop\進行中\(zhòng)子文件"
file_to_save = r"C:\Users\22330\Desktop\進行中\(zhòng)Data_combine.xlsx"
df_lists = [] # 用于存儲每個子文件的DataFrame
for item in os.listdir(son_file_path):
if item.endswith(".xlsx"):
file_path = os.path.join(son_file_path,item)
df = pd.read_excel(file_path)
df["son_id"] = item.split(".")[0] # 提取子文件的id作為新的一列
df_lists.append(df) # 將當前子文件的DataFrame添加到列表中
# 使用Concat合并所有子文件的DataFrame
pd.concat(df_lists,axis=0).to_excel(file_to_save,index=False)
最后輸出的文件中,就會多出我們新增的一列son_id,整個的處理非常迅速。

4.2 批量進行表格拆分
既然已經講了合并,我們順手也來看看拆分,我們的拆分需求是將表格平均分到若干個表里,在下面的程序中,我通過son_file_num 定義了要拆分的個數,通過考慮了除不盡的情況,然后依次按索引取值,放到每個表中
import pandas as pd
import os
file_path = r"C:\Users\22330\Desktop\進行中\(zhòng)Data.xlsx"
save_path = r"C:\Users\22330\Desktop\進行中\(zhòng)子文件"
if not os.path.exists(save_path): # 如果子文件目錄不存在,就創(chuàng)建一個
os.mkdir(save_path)
df = pd.read_excel(file_path)
print(df.head(3)) # 查看前3行數據
print(df.shape) # 查看數據條數和特征數
son_file_num = 4
son_file_size = df.shape[0] // son_file_num # 每個子文件的數據條數
if df.shape[0] % son_file_num != 0: # 如果數據條數不能被子文件數整除,需要額外增加一條數據
son_file_size += 1
for i in range(son_file_num):
start = i * son_file_size
end = start + son_file_size
df_son = df.iloc[start:end] # 這里的end是不包含在切片中的,所以不需要-1
df_son.to_excel(f"{save_path}\{file_path.split('.')[1]}_{i}.xlsx",index=False)
命令行輸出了我們的一些調試信息,可想而知,會按152:152:152:150 的比例分配數據,實現拆分
出庫日期 產品經理 產品類別 地區(qū) 安全等級 銷售額(元) 銷售數量 客戶評分
0 2023-06-01 Jerry 電子產品 西南 C 3789.6 12 5.0
1 2023-06-02 Cary 服裝 華東 A 2345.3 14 5.0
2 2023-06-03 Bob-Smith 家居用品 西北 D 567.8 7 3.7
(606, 8)
到此這篇關于Pandas基礎使用指南之排序、字符串日期處理和文件合并拆分技巧的文章就介紹到這了,更多相關Python Pandas使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python+selenium開發(fā)環(huán)境搭建圖文教程
這篇文章主要為大家詳細介紹了python+selenium開發(fā)環(huán)境搭建的圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08

