Jan. 15th, 2018
最近一個(gè)小項(xiàng)目中匀伏,需要完成以下事情蜘醋。有一個(gè)csv文件,里面的每一條記錄是一個(gè)計(jì)算任務(wù)的編號荧关,內(nèi)容描述溉奕,在超算系統(tǒng)里的process ID以及計(jì)算結(jié)果的md5映射(列的名稱分別為“task_id”,“task_desc”忍啤,“process_id”和“md5”)加勤。另外,有一個(gè)文件存放著已完成的任務(wù)的process_ID同波。我的任務(wù)是查找出所有完成的任務(wù)的md5映射值鳄梅。
在SQL數(shù)據(jù)庫里,這是一個(gè)非常標(biāo)準(zhǔn)的查詢:
SELECT md5 FROM task_table WHERE process_id IN process_list;
使用Pandas我們也可以非常容易地完成這個(gè)查詢未檩。
關(guān)于更多SQL語句的Pandas對應(yīng)實(shí)現(xiàn)戴尸,可參見這一篇文章。
構(gòu)建process_list:文件讀取
所有已完成任務(wù)的process_id被存在文件"completed_task.txt"中讹挎。文件的每一行是一個(gè)id校赤。因此得到process_list
列表非常容易:
process_id = open("completed_task.txt", 'r').read().split('\n')
這里假設(shè)文件中沒有空行,而且換行符都是'\n'筒溃。由于csv文件中"process_id"都是以字符串存放(會有補(bǔ)零位)马篮, 因此我們保留其字符串格式而不轉(zhuǎn)換為整數(shù)。
Pandas Dataframe預(yù)處理和篩選
接下來我們讀取tasks.csv
文件并進(jìn)行預(yù)處理怜奖,篩選和結(jié)果存放浑测。
import pandas as pd
from math import nan # 用于處理空缺位。
df = pd.read_csv('tasks.csv', sep='\t') # 此文件以tab符分割數(shù)據(jù)歪玲。
df['md5'].replace(nan, "", inplace=True) # 此問題并不需要這樣做迁央,不過有字符串處理的任務(wù)就需要
md5_selected = df[df['process_id'].isin(process_id)]['md5']
md5_list = md5_selected.tolist()
open('completed_md5.txt', 'w').write('\n'.join(md5_list)) # 將篩選的數(shù)據(jù)存儲到另一個(gè)文件中。
這里用到了以下知識點(diǎn)(敲黑板):
- pandas讀取csv文檔滥崩,設(shè)定分隔符岖圈。(作業(yè):自己回憶如何讀取Excel文檔。)
- 空白數(shù)據(jù)清洗:當(dāng)一個(gè)值缺失時(shí)钙皮,Pandas默認(rèn)使用
math.nan
代替蜂科。如果不對其預(yù)處理顽决,過后在進(jìn)行字符串操作時(shí)有可能產(chǎn)生錯(cuò)誤。這里將其替換成空行导匣。 - Pandas查詢才菠。
md5_selected = df[df['process_id'].isin(process_id)]['md5']
就是Pandas實(shí)現(xiàn)前面提到的那條SQL查詢語句的方法。