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 列
的字符串中有很多包含單引號,所以通過單引號進行分割時,得到的 DataFrame
有10列
,多出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]