for循環太Low?分享幾段我工作中經常使用的for代碼!
- 2019 年 10 月 8 日
- 筆記
作者:劉順祥
來源:數據分析1480
前言
不管是for循環還是while循環,都是任何一門語言的基礎知識,同時也是非常重要的知識。藉助於循環的策略,可以將很多重複性的問題完美地解決。在Python中,大家可能對她的印象是「Python不適合使用循環,因為效率低,速度慢!」,但是本文中將重點介紹她,並跟大家分享我工作常用的幾段代碼示例(如果你想實操,文末有數據下載鏈接)。
for循環示意圖
可以有部分朋友還不太清楚for循環的工作機制,這裡畫一個簡單的示意圖,希望讀者能夠理解她的邏輯。

如上圖所示,圖中包含for循環過程中的三個部分,分別是漏斗、漏斗內的元素以及漏斗以下的結構,這三個部分構成了for循環的核心。讀者可以將圖中的三個核心內容分別理解為容器對象(即Python中的基礎數據結構,如字符串、列表、元組和字典等)、容器內的元素以及循環體。上圖中,左右兩個示意圖的唯一區別在於,for循環的循環體是否包含if分支判斷。
案例1:多數據文件的合併
如下圖所示,本地目錄內包含需要讀取的多個數據文件,它們均為csv格式或txt格式,且數據結構相同。該如何基於Python的for循環語句實現數據的讀取與合併呢?

# 導入第三方模塊 import pandas as pd # 用於讀取數據 import os # 用於返回目錄內的文件名稱 # 指定待讀取數據所在的目錄 path = r'D:datas' # 構造空列表datas,用於存儲所有文件的數據 datas = [] for filename in os.listdir(path): # 判斷文件類型是否為txt格式 if filename.find('txt') != -1: # 讀取txt格式的數據 data = pd.read_csv(path + '\' + filename, sep = 't') else: # 讀取csv格式的數據 data = pd.read_csv(path + '\' + filename) # 將讀取的每一個數據集存儲到datas列表中 datas.append(data) # 將所有數據文件做合併 final_data = pd.concat(datas) final_data

案例2:數據單位的統一處理
如下圖所示,數據集中關於APP的下載量和軟件大小涉及到不同的數據單位,如APP的文件大小有KB單位也有MB單位。很顯然,單位不一致的數據肯定是不能直接用來分析和建模的。所以,該如何藉助於for循環的手段將數據做一致性的清洗呢?

# 讀取數據 apps = pd.read_excel('apps.xlsx') # 處理安裝量字段install,將數據統一為「萬」的單位 install_new = [] for i in apps['install']: # 判斷安裝量是否已「億」為單位 if i.find('億') != -1: install_new.append(str(float(i[:-1])*10000) + '萬') # 判斷安裝量是否已「萬」為單位 elif i.find('萬') != -1: install_new.append(i) else: install_new.append(str(int(i)/10000) + '萬') # 將install_new轉換為序列對象,並替換數據集apps內原始字段install的值 apps['install'] = pd.Series(install_new) # 處理軟件大小size,將數據統一為「MB」的單位 size_new = [] for i in apps['size']: # 判斷軟件大小是否已「KB」為單位 if i.find('KB') != -1: size_new.append(str(round(float(i[:-2])/1024,2)) + 'MB') else: size_new.append(i) # 將size_new轉換為序列對象,並替換數據集apps內原始字段size的值 apps['size'] = pd.Series(size_new) # 查看數據轉換後的前10行 apps.head(10)

案例3:詞頻統計
如下圖所示,這是一篇新聞報道,如何基於該報道完成詞頻統計的操作?由於實際工作中評論數據的分析會涉及到敏感信息,故這裡用新聞報道代替,但下文中所介紹的代碼核心部分基本類似。:

# 導入第三方模塊 import jieba # 用於中文句子的切詞 import collections # 用於詞頻的排序 # 讀入新聞報道 fn = open('news.txt', encoding='utf-8') news = fn.readlines() # 將新聞報道的各段內容拼接為一個整體 news = ''.join(news) # 刪除特殊字符,如「n」 news = news.replace('n', '') # 對新聞內容切詞,並保留1個長度以上的詞 words = [] for i in jieba.lcut(news): # 通過邏輯判斷,保留至少包含兩個字符的詞 if len(i) > 1: words.append(i) # 詞頻統計,並將詞頻結果存儲到字典中 wf = {} for i in set(words): wf[i] = words.count(i) # 對詞頻結果做排序 collections.Counter(wf).most_common()

結語
OK,今天的內容就分享到這裡,如果你有任何問題,歡迎在公眾號的留言區域表達你的疑問。同時,也歡迎各位大咖在留言區分享你們自己的策略,我會第一時間將你的留言分享給大家。
【數據鏈接】
鏈接:
https://pan.baidu.com/s/18Q8WHJW0etG__pxLv_-rng
提取碼:zznv