使用python數(shù)據(jù)清洗代碼實(shí)例
數(shù)據(jù)讀入與寫出
csv
針對(duì)csv格式的數(shù)據(jù),最簡(jiǎn)單的一種方法是用pandas中的read_csv方法,具體代碼如下。其中第一個(gè)參數(shù)為待讀入數(shù)據(jù)的路徑,一個(gè)實(shí)用小技巧為./表示當(dāng)前文件夾,../表示上層文件夾。這樣如果待讀入文件與代碼文件在同一個(gè)文件夾下,可以節(jié)省掉很多層文件路徑的輸入。另外兩個(gè)我較常用的參數(shù)為encoding和sep,其中encoding可指定數(shù)據(jù)UTF編碼,sep為指定數(shù)據(jù)分隔符,默認(rèn)為,,但我經(jīng)常遇到以\t為分隔符的數(shù)據(jù)。如果你遇到了類似這樣的報(bào)錯(cuò)ParserError: Error tokenizing data. C error: Expected 1 fields in line 57, saw 3,可以考慮下是不是分隔符不對(duì)。
import pandas as pd
pd.read_csv('*.csv',encoding='gbk',sep='\t')此外,有時(shí)候一個(gè)文件太大。其分別存儲(chǔ)在不同文件中,甚至分開存儲(chǔ)在不同文件夾下,這時(shí)就需考慮批量讀取了。 在展示代碼前,先介紹一下數(shù)據(jù)背景。現(xiàn)在我有一個(gè)叫obj的文件夾,其中存儲(chǔ)了一系列以’job_id='開頭的文件夾,在每個(gè)文件夾中又存儲(chǔ)了一系列以’job_id='開頭的csv的文件。這些文件存儲(chǔ)的都是同一種數(shù)據(jù),目前我的任務(wù)是讀入這一批數(shù)據(jù),并合并成一個(gè)數(shù)據(jù)框。
file_dir=glob.glob('./obj/job_id=*')
df = pd.DataFrame()
for i in file_dir:
file=glob.glob(os.path.join(i, "job_id=*.csv"))
file.sort()
a = pd.read_csv(file[0])
for f in file[1:]:
b = pd.read_csv(f,header=None)
b.columns = a.columns
a = pd.concat([a,b],ignore_index=True)
df = pd.concat([df,tmc],ignore_index=True)glob.glob:返回匹配的文件列表。
os.path.join:拼接文件路徑。
file.sort():對(duì)文件按文件名進(jìn)行排序,主要我讀取的文件,按文件名排序第一的文件數(shù)據(jù)有列名,其他文件沒有列名,這里就需介紹一下pd.read_csv的參數(shù)header,若header=None,則表明文件第一行非列名,否則將以列名讀入python。
除了讀入數(shù)據(jù),另一個(gè)需要考慮的就是讀出數(shù)據(jù)了。第一個(gè)參數(shù)指定讀出的文件路徑以及文件名。python中如果該文件已經(jīng)存在,則直接覆蓋。若不需要讀出數(shù)據(jù)框的index,則選擇index=False,encoding指定讀出文件的UTF編碼。
df.to_csv('./*.csv',index=False,encoding='gbk)txt
介紹一個(gè)txt文件的讀取方式。file_name為文件路徑,使用with open as則在數(shù)據(jù)讀入結(jié)束后能自動(dòng)關(guān)閉文件夾節(jié)約內(nèi)存,推薦使用這種方式。readlines自動(dòng)按行讀取所有文件,以列表返回,此外還可以選擇realine:一次讀取一行文件,read:以一個(gè)字符串讀取所有文件。
with open(file_name) as file:
for line in file.readlines():
pass這里返回的每一行數(shù)據(jù)(line),是以字符串的形式返回的,可考慮將字符串進(jìn)行處理,提取需要的信息。這里介紹幾個(gè)好用的字符串函數(shù):當(dāng)使用readlines時(shí),每行數(shù)據(jù)末尾以\n結(jié)束,line.rstrip():刪除 string 字符串末尾的指定字符,若沒有指定。默認(rèn)刪除空格,tab,跨行符。 line.split():按指定字符分割字符串,并以列表的形式返回。
數(shù)據(jù)清洗
時(shí)間處理
- 時(shí)間的加減
import datetime
start_time = '2022-01-12 12:11:00'
time = datetime.datetime.strptime(start_time,'%Y-%m-%d %H:%M:%S')
time = time+datetime.timedelta(minutes=5)
time.strftime('%Y-%m-%d %H:%M:%S')strptime:將字符串轉(zhuǎn)化為時(shí)間格式。
+datetime.timedelta(minutes=5):在原時(shí)間基礎(chǔ)上加5分鐘,除minutes以外,還可選擇的有weeks、days、hours、seconds等。同理若將+改為-,則是減掉5分鐘。
strftime:將時(shí)間格式轉(zhuǎn)換為字符串。
- 顯示給定時(shí)間為周幾
如果是數(shù)據(jù)框,可使用如下代碼:
df = pd.DataFrame({'day':['2021-11-12','2021-11-13','2021-11-14']})
pd.to_datetime(df.day).dt.weekday+1可看出如上日期分別對(duì)應(yīng)周五、周六、周天
- 給定日期,顯示為一年中的第幾周。
pd.to_datetime('2021-11-12').isocalendar()[1]isocalendar()返回時(shí)間所處的年份,以及該年的第幾周,為周幾,其結(jié)果對(duì)應(yīng)的第二個(gè)位置,即為第幾周。
- 生成時(shí)間上的等差數(shù)列
pd.date_range(start='2021-11-12',end='2021-11-14',freq="1h",inclusive='left')
freq:控制等差數(shù)列的間隔,1h表示每一小時(shí)生成一個(gè)數(shù)。常用的選項(xiàng)還有D,W,M,H,min,S分別對(duì)應(yīng)天、周、月、小時(shí)、分鐘、秒。
inclusive:控制是否包含start和end,若為left則生成的時(shí)間等差數(shù)列不包含end對(duì)應(yīng)時(shí)間,可供選擇的還有both、neither、right。
數(shù)據(jù)聚合
- groupby
groupby是pandas中非常好用的一個(gè)函數(shù),其主要功能是將數(shù)據(jù)框按某一特征分組。結(jié)合相關(guān)聚合函數(shù),能非常迅速地計(jì)算出需要的指標(biāo)。 例如計(jì)算某班上男生和女生的平均身高:
df = pd.DataFrame({'性別':['男','女','女','男','男','男','女','男','男','女','女',],
'身高':[179,160,167,170,169,180,155,177,182,158,162]})
df.groupby('性別').身高.mean().reset_index()groupby可根據(jù)多個(gè)特征分組,需用列表表示:df.groupby(['性別','年紀(jì)'])
- groupby+agg
利用groupby+agg將能實(shí)現(xiàn)非常強(qiáng)大的功能,且代碼也更加簡(jiǎn)潔。
例如計(jì)算班上男生女生的平均身高與最高身高、最低身高
df.groupby('性別').agg({'身高':['mean','max','min']}).reset_index()- apply
apply函數(shù)可對(duì)數(shù)據(jù)框的行或列應(yīng)用指定的方法,并返回值,默認(rèn)為行。
- 常用聚合函數(shù)
value_counts:對(duì)某一離散變量不同類別計(jì)數(shù),默認(rèn)對(duì)缺失值不計(jì)數(shù)。count:統(tǒng)計(jì)非缺失值個(gè)數(shù)。mean:求均值median:求中位數(shù)max:求最大值min:求最小值quantile:求分位數(shù)
批量操作
- 列表解析式
如若需要對(duì)列表的每一個(gè)元素進(jìn)行操作,并返回同樣大小的列表,可考慮使用列表解析器,例如對(duì)某元素進(jìn)行向上取整:
import math lst = [1.1,1.5,2.3,4.7,2.1] [math.ceil(i) for i in lst]
- map
map語(yǔ)法為:map(function, iterable, ...),function將iterable中每一個(gè)元素作為參數(shù)調(diào)用,并返回map對(duì)象,使用list可將其轉(zhuǎn)換為列表。同樣對(duì)某元素進(jìn)行向上取整:
list(map(math.ceil,lst))
另外還有一個(gè)map是pandas包中的map函數(shù),功能上與上述map方法類似。此外其還有一個(gè)很好用的替換功能。例如將上面身高數(shù)據(jù)中,男生替換為man,女生替換為woman
geder_map = {'男':'man','女':'woman'}
df.性別.map(geder_map)數(shù)據(jù)合并
- pandas.merge
merge是pandas中的一種方法,用于將數(shù)據(jù)框根據(jù)某一列或多列合并。
pandas.merge(left, right, how='inner', on=None)
left、right分別對(duì)應(yīng)需要合并的兩個(gè)數(shù)據(jù)框,how表示合并的方式,可選擇:inner、outer、left、right,on表示合并數(shù)據(jù)的參考列,若需根據(jù)多列合并數(shù)據(jù),以列表形式表示。
應(yīng)用:生成笛卡爾積:
df1 = pd.DataFrame({'時(shí)間':['2021','2022','2023','2024'],'value':1})
df2 = pd.DataFrame({'地點(diǎn)':['北京','上海'],'value':1})
pd.merge(df1,df2,on='value').drop('value',axis=1)- pandas.concat
pandas.concat(objs, axis=0, join='outer', ignore_index=False)
concat用于將數(shù)據(jù)框按行或列直接合并。axis=0表示按行合并,列名對(duì)齊,axis=1表示按列合并,index對(duì)齊。join可選擇項(xiàng)有inner和outer,outer保留所有數(shù)據(jù),inner只保留交集數(shù)據(jù)。ignore_index:合成的新數(shù)據(jù)集是否保留原index。
df1 = pd.DataFrame({'a':range(5),'b':range(5,10)})
df2 = pd.DataFrame({'a':range(10,15),'b':range(15,20)})
df3 = pd.DataFrame({'c':range(10,16),'d':range(15,21)})
pd.concat([df1,df2],axis=0,ignore_index=True)
pd.concat([df1,df3],axis=1,ignore_index=True,join='inner')- append
append為list中的一種方法,向list末尾加入一條數(shù)據(jù),注意這里每次將需加入的數(shù)據(jù)作為一個(gè)整體添加到list末尾,如果需要合并兩個(gè)list,可考慮利用下面+的方法。
lst1 = list(range(5)) lst2 = list(range(5)) lst1.append(lst2)
“+”
+可將兩個(gè)列表合并。此外+還可以用于連接兩個(gè)字符串。
lst1 = list(range(5)) lst2 = list(range(5)) lst1 + lst2 'i'+' '+'love'+' '+'you'
缺失值
- isnull()、notnull()
isnull()、notnull()是pandas中的方法,是用于判斷某個(gè)位置數(shù)據(jù)是否為空,一般結(jié)合聚合函數(shù)使用,能迅速計(jì)算出數(shù)據(jù)的缺失情況。
- fillna()
DataFrame.fillna(value=None,inplace=False)
fillna用于填充數(shù)據(jù)框中的缺失值,value是用于填充的值,inplace表示填充后的數(shù)據(jù)是否覆蓋原數(shù)據(jù)。
- dropna()
DataFrame.dropna(axis=0, how='any', inplace=False)
dropna用于刪掉存在缺失值的行,axis表示按行還是按列刪除,how表示方法,可選擇any、all。inplace表示刪除后的數(shù)據(jù)是否覆蓋原數(shù)據(jù)。
橫向數(shù)據(jù)與縱向數(shù)據(jù)轉(zhuǎn)換
- pivot_table
將縱表轉(zhuǎn)換為橫表,其中index為不需要變動(dòng)的列的名字,columns為轉(zhuǎn)換為橫表后為列名的那一列,values為轉(zhuǎn)換為橫表后為值的那一列。
df.pivot_table(index=,columns=,values=).reset_index()
- melt
將橫表轉(zhuǎn)換為縱表,其中id_vars為不需要轉(zhuǎn)換的列的名字,var_name為原橫表列名轉(zhuǎn)換后的生成的新列列名,value_name為原橫表值轉(zhuǎn)換后生成新列的列名。
df.melt(id_vars=,var_name=,value_name=)
其他
- pandas.DataFrame.sort_values() 排序
- list.sort() 排序
- reset_index() 將index轉(zhuǎn)換為列
- pandas.DataFrame.drop_duplicates() 刪掉重復(fù)的數(shù)據(jù)
- pandas.DataFrame.drop() 刪掉某行或某列
- pandas.str.slice() 對(duì)字符串進(jìn)行切片
- pandas.str.split() 按指定字符分割字符串
- json.loads() json格式數(shù)據(jù)的讀取
到此這篇關(guān)于使用python數(shù)據(jù)清洗代碼實(shí)例的文章就介紹到這了,更多相關(guān)python數(shù)據(jù)清洗代碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python匹配兩個(gè)短語(yǔ)之間的字符實(shí)例
今天小編就為大家分享一篇python匹配兩個(gè)短語(yǔ)之間的字符實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
計(jì)算機(jī)二級(jí)python學(xué)習(xí)教程(1) 教大家如何學(xué)習(xí)python
這篇文章主要為大家詳細(xì)介紹了計(jì)算機(jī)二級(jí)python學(xué)習(xí)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
python利用hook技術(shù)破解https的實(shí)例代碼
python利用hook技術(shù)破解https的實(shí)例代碼,需要的朋友可以參考一下2013-03-03
django js實(shí)現(xiàn)部分頁(yè)面刷新的示例代碼
今天小編就為大家分享一篇django js實(shí)現(xiàn)部分頁(yè)面刷新的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Python:Scrapy框架中Item Pipeline組件使用詳解
這篇文章主要介紹了Python:Scrapy框架中Item Pipeline組件使用詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12
Python3.6中Twisted模塊安裝的問(wèn)題與解決
這篇文章主要介紹了Python3.6中Twisted模塊安裝的問(wèn)題與解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
python利用TextBlob庫(kù)實(shí)現(xiàn)輕松分析文本情感
TextBlob是一個(gè)基于NLTK(Natural Language Toolkit)和Pattern庫(kù)的Python庫(kù),它提供了一系列方便的接口和方法來(lái)處理文本數(shù)據(jù),下面我們就來(lái)學(xué)習(xí)一下如何利用TextBlob庫(kù)實(shí)現(xiàn)輕松分析文本情感吧2023-12-12

