如何在pandas中使用正則表達式處理數據——巧用replace函數中的repl參數

1、獲取數據源

可以下載下來後,從 csv 讀取;或直接從該網址獲取,但是網速較差時,直接從網址獲取可能會報錯

path = r"D:\01_學習相關\01_編程學習\02_Python\08_數據分析\00_datas\Online_Retail.csv"  # 本地存放 csv 的絕對路徑

online_rt = pd.read_csv(path)
online_rt  
# Out[526]: 
#       InvoiceNo,StockCode,Description,Quantity,InvoiceDate,UnitPrice,CustomerID,Country
# 0      536365,85123A,WHITE HANGING HEART T-LIGHT HOLD...                               
# 1      536365,71053,WHITE METAL LANTERN,6,12/1/10 8:2...                               
# 2      536365,84406B,CREAM CUPID HEARTS COAT HANGER,8...                               
# 3      536365,84029G,KNITTED UNION FLAG HOT WATER BOT...                               
# 4      536365,84029E,RED WOOLLY HOTTIE WHITE HEART.,6...                               
#                                                   ...                               
# 50139  540547,84913B,MINT GREEN ROSE TOWEL,4,1/9/11 1...                               
# 50140  540547,84913A,SOFT PINK ROSE TOWEL ,4,1/9/11 1...                               
# 50141    540547,C2,CARRIAGE,1,1/9/11 16:07,50,14911,EIRE                               
# 50142  540548,22726,ALARM CLOCK BAKELIKE GREEN,4,1/9/...                               
# 50143  540548,22727,ALARM CLOCK BAKELIKE RED ,4,1/9/1...                               
# [50144 rows x 1 columns]

從下面這張圖中,可以發現 Description 列 的字符串中有很多包含單引號,所以通過單引號進行分割時,得到的 DataFrame10列,多出2列
在這裏插入圖片描述

2、使用 正則 對數據進行分割

pd.DataFrame(list(online_rt[online_rt.columns[0]].str.split(',')))
# Out[531]: 
#             0       1  ...     8     9
# 0      536365  85123A  ...  None  None
# 1      536365   71053  ...  None  None
# 2      536365  84406B  ...  None  None
# 3      536365  84029G  ...  None  None
# 4      536365  84029E  ...  None  None
#        ...     ...  ...   ...   ...
# 50139  540547  84913B  ...  None  None
# 50140  540547  84913A  ...  None  None
# 50141  540547      C2  ...  None  None
# 50142  540548   22726  ...  None  None
# 50143  540548   22727  ...  None  None
# [50144 rows x 10 columns]

思路一: 使用 str.replace(r'(".*),(.*")', r'\1 \2', regex=True)雙引號內的逗號 替換爲 空格


online_rt.iloc[956, :].values  # 原數據
# Out[529]: 
# array(['536520,22760,"TRAY, BREAKFAST IN BED",1,12/1/10 12:43,12.75,14729,United Kingdom'],
#       dtype=object)

online_rt[online_rt.columns[0]].str.replace(r'(".*),(.*")', r'\1 \2', regex=True)[956]  # 替換後的結果  
# Out[533]: '536520,22760,"TRAY  BREAKFAST IN BED",1,12/1/10 12:43,12.75,14729,United Kingdom'

""" 但是,該規則僅適用於雙引號之間只有一個逗號的情況,當逗號個數大於1時,還是會出錯。如下: """
online_rt.iloc[2678].to_numpy()  # 原數據
# Out[634]: 
# array(['536592,22245,"HOOK, 1 HANGER ,MAGIC GARDEN",2,12/1/10 17:06,1.66,,United Kingdom'],
      dtype=object)
      
online_rt[online_rt.columns[0]].str.replace(r'(".*),(.*")', r'\1 \2', regex=True)[2678]  # 替換後的結果
# Out[631]: '536592,22245,"HOOK, 1 HANGER  MAGIC GARDEN",2,12/1/10 17:06,1.66,,United Kingdom'

思路二: 先定義一個 repl 函數,該函數的作用是,給成功匹配到的數據中的逗號 全部替換爲空格,再使用 str.replace(r'"(.*)"', repl, regex=True) 正則,實現整個 DataFrame 的替換

def repl(matchobj):
    # print(matchobj.group(1))
    return matchobj.group(1).replace(",", " ")
    
     
ret = pd.DataFrame(online_rt[online_rt.columns[0]].str.replace(r'"(.*)"', repl, regex=True).str.split(",").to_list())  
ret  # 結果中的 DataFrame 正好 8 列,成功實現目標 
# Out[716]: 
#             0       1  ...      6               7
# 0      536365  85123A  ...  17850  United Kingdom
# 1      536365   71053  ...  17850  United Kingdom
# 2      536365  84406B  ...  17850  United Kingdom
# 3      536365  84029G  ...  17850  United Kingdom
# 4      536365  84029E  ...  17850  United Kingdom
#        ...     ...  ...    ...             ...
# 50139  540547  84913B  ...  14911            EIRE
# 50140  540547  84913A  ...  14911            EIRE
# 50141  540547      C2  ...  14911            EIRE
# 50142  540548   22726  ...  14794  United Kingdom
# 50143  540548   22727  ...  14794  United Kingdom
# [50144 rows x 8 columns]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章