使用python數(shù)據(jù)清洗代碼實例
數(shù)據(jù)讀入與寫出
csv
針對csv格式的數(shù)據(jù),最簡單的一種方法是用pandas中的read_csv方法,具體代碼如下。其中第一個參數(shù)為待讀入數(shù)據(jù)的路徑,一個實用小技巧為./
表示當(dāng)前文件夾,../
表示上層文件夾。這樣如果待讀入文件與代碼文件在同一個文件夾下,可以節(jié)省掉很多層文件路徑的輸入。另外兩個我較常用的參數(shù)為encoding和sep,其中encoding可指定數(shù)據(jù)UTF編碼,sep為指定數(shù)據(jù)分隔符,默認(rèn)為,
,但我經(jīng)常遇到以\t
為分隔符的數(shù)據(jù)。如果你遇到了類似這樣的報錯ParserError: Error tokenizing data. C error: Expected 1 fields in line 57, saw 3
,可以考慮下是不是分隔符不對。
import pandas as pd pd.read_csv('*.csv',encoding='gbk',sep='\t')
此外,有時候一個文件太大。其分別存儲在不同文件中,甚至分開存儲在不同文件夾下,這時就需考慮批量讀取了。 在展示代碼前,先介紹一下數(shù)據(jù)背景。現(xiàn)在我有一個叫obj的文件夾,其中存儲了一系列以’job_id='開頭的文件夾,在每個文件夾中又存儲了一系列以’job_id='開頭的csv的文件。這些文件存儲的都是同一種數(shù)據(jù),目前我的任務(wù)是讀入這一批數(shù)據(jù),并合并成一個數(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():對文件按文件名進行排序,主要我讀取的文件,按文件名排序第一的文件數(shù)據(jù)有列名,其他文件沒有列名,這里就需介紹一下pd.read_csv的參數(shù)header,若header=None,則表明文件第一行非列名,否則將以列名讀入python。
除了讀入數(shù)據(jù),另一個需要考慮的就是讀出數(shù)據(jù)了。第一個參數(shù)指定讀出的文件路徑以及文件名。python中如果該文件已經(jīng)存在,則直接覆蓋。若不需要讀出數(shù)據(jù)框的index,則選擇index=False,encoding指定讀出文件的UTF編碼。
df.to_csv('./*.csv',index=False,encoding='gbk)
txt
介紹一個txt文件的讀取方式。file_name為文件路徑,使用with open as則在數(shù)據(jù)讀入結(jié)束后能自動關(guān)閉文件夾節(jié)約內(nèi)存,推薦使用這種方式。readlines自動按行讀取所有文件,以列表返回,此外還可以選擇realine:一次讀取一行文件,read:以一個字符串讀取所有文件。
with open(file_name) as file: for line in file.readlines(): pass
這里返回的每一行數(shù)據(jù)(line),是以字符串的形式返回的,可考慮將字符串進行處理,提取需要的信息。這里介紹幾個好用的字符串函數(shù):當(dāng)使用readlines時,每行數(shù)據(jù)末尾以\n
結(jié)束,line.rstrip()
:刪除 string 字符串末尾的指定字符,若沒有指定。默認(rèn)刪除空格,tab,跨行符。 line.split()
:按指定字符分割字符串,并以列表的形式返回。
數(shù)據(jù)清洗
時間處理
- 時間的加減
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)化為時間格式。
+datetime.timedelta(minutes=5):在原時間基礎(chǔ)上加5分鐘,除minutes以外,還可選擇的有weeks、days、hours、seconds等。同理若將+改為-,則是減掉5分鐘。
strftime:將時間格式轉(zhuǎn)換為字符串。
- 顯示給定時間為周幾
如果是數(shù)據(jù)框,可使用如下代碼:
df = pd.DataFrame({'day':['2021-11-12','2021-11-13','2021-11-14']}) pd.to_datetime(df.day).dt.weekday+1
可看出如上日期分別對應(yīng)周五、周六、周天
- 給定日期,顯示為一年中的第幾周。
pd.to_datetime('2021-11-12').isocalendar()[1]
isocalendar()
返回時間所處的年份,以及該年的第幾周,為周幾,其結(jié)果對應(yīng)的第二個位置,即為第幾周。
- 生成時間上的等差數(shù)列
pd.date_range(start='2021-11-12',end='2021-11-14',freq="1h",inclusive='left')
freq
:控制等差數(shù)列的間隔,1h表示每一小時生成一個數(shù)。常用的選項還有D,W,M,H,min,S分別對應(yīng)天、周、月、小時、分鐘、秒。
inclusive
:控制是否包含start和end,若為left則生成的時間等差數(shù)列不包含end對應(yīng)時間,可供選擇的還有both、neither、right。
數(shù)據(jù)聚合
- groupby
groupby是pandas中非常好用的一個函數(shù),其主要功能是將數(shù)據(jù)框按某一特征分組。結(jié)合相關(guān)聚合函數(shù),能非常迅速地計算出需要的指標(biāo)。 例如計算某班上男生和女生的平均身高:
df = pd.DataFrame({'性別':['男','女','女','男','男','男','女','男','男','女','女',], '身高':[179,160,167,170,169,180,155,177,182,158,162]}) df.groupby('性別').身高.mean().reset_index()
groupby可根據(jù)多個特征分組,需用列表表示:df.groupby(['性別','年紀(jì)'])
- groupby+agg
利用groupby+agg將能實現(xiàn)非常強大的功能,且代碼也更加簡潔。
例如計算班上男生女生的平均身高與最高身高、最低身高
df.groupby('性別').agg({'身高':['mean','max','min']}).reset_index()
- apply
apply函數(shù)可對數(shù)據(jù)框的行或列應(yīng)用指定的方法,并返回值,默認(rèn)為行。
- 常用聚合函數(shù)
value_counts
:對某一離散變量不同類別計數(shù),默認(rèn)對缺失值不計數(shù)。count
:統(tǒng)計非缺失值個數(shù)。mean
:求均值median
:求中位數(shù)max
:求最大值min
:求最小值quantile
:求分位數(shù)
批量操作
- 列表解析式
如若需要對列表的每一個元素進行操作,并返回同樣大小的列表,可考慮使用列表解析器,例如對某元素進行向上取整:
import math lst = [1.1,1.5,2.3,4.7,2.1] [math.ceil(i) for i in lst]
- map
map語法為:map(function, iterable, ...)
,function將iterable中每一個元素作為參數(shù)調(diào)用,并返回map對象,使用list可將其轉(zhuǎn)換為列表。同樣對某元素進行向上取整:
list(map(math.ceil,lst))
另外還有一個map是pandas包中的map函數(shù),功能上與上述map方法類似。此外其還有一個很好用的替換功能。例如將上面身高數(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分別對應(yīng)需要合并的兩個數(shù)據(jù)框,how表示合并的方式,可選擇:inner、outer、left、right,on表示合并數(shù)據(jù)的參考列,若需根據(jù)多列合并數(shù)據(jù),以列表形式表示。
應(yīng)用:生成笛卡爾積:
df1 = pd.DataFrame({'時間':['2021','2022','2023','2024'],'value':1}) df2 = pd.DataFrame({'地點':['北京','上海'],'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表示按行合并,列名對齊,axis=1表示按列合并,index對齊。join可選擇項有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ù)作為一個整體添加到list末尾,如果需要合并兩個list,可考慮利用下面+
的方法。
lst1 = list(range(5)) lst2 = list(range(5)) lst1.append(lst2)
“+”
+
可將兩個列表合并。此外+
還可以用于連接兩個字符串。
lst1 = list(range(5)) lst2 = list(range(5)) lst1 + lst2 'i'+' '+'love'+' '+'you'
缺失值
- isnull()、notnull()
isnull()、notnull()是pandas中的方法,是用于判斷某個位置數(shù)據(jù)是否為空,一般結(jié)合聚合函數(shù)使用,能迅速計算出數(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為不需要變動的列的名字,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() 對字符串進行切片
- pandas.str.split() 按指定字符分割字符串
- json.loads() json格式數(shù)據(jù)的讀取
到此這篇關(guān)于使用python數(shù)據(jù)清洗代碼實例的文章就介紹到這了,更多相關(guān)python數(shù)據(jù)清洗代碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用Python進行數(shù)據(jù)清洗與存儲的基本方法
- 如何使用Python數(shù)據(jù)清洗庫
- 用Python進行數(shù)據(jù)清洗以及值處理
- Python常用的數(shù)據(jù)清洗方法詳解
- 一文帶你深入了解Python中的數(shù)據(jù)清洗
- 三個Python常用的數(shù)據(jù)清洗處理方式總結(jié)
- Python數(shù)據(jù)清洗&預(yù)處理入門教程
- python?文件讀寫和數(shù)據(jù)清洗
- Python實現(xiàn)數(shù)據(jù)清洗的示例詳解
- python數(shù)據(jù)清洗中的時間格式化實現(xiàn)
- Python實現(xiàn)數(shù)據(jù)清洗的18種方法
相關(guān)文章
Pytorch反向求導(dǎo)更新網(wǎng)絡(luò)參數(shù)的方法
今天小編就為大家分享一篇Pytorch反向求導(dǎo)更新網(wǎng)絡(luò)參數(shù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08python第三方包安裝路徑site-packages下.libs作用詳解
這篇文章主要為大家介紹了python?第三方包安裝路徑?site-packages?下面的以?.libs?結(jié)尾的路徑作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09Python實現(xiàn)搜索Google Scholar論文信息的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Python實現(xiàn)搜索Google Scholar論文信息的功能,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-03-03利用Python實現(xiàn)Markdown文檔格式轉(zhuǎn)換詳解
這篇文章主要介紹了如何利用Python中的MarkItDown庫將多種文件高效轉(zhuǎn)換為Markdown文本,以及如何使用Python-Markdown庫將Markdown文本轉(zhuǎn)換為HTML,需要的可以參考下2025-03-03訊飛webapi語音識別接口調(diào)用示例代碼(python)
這篇文章主要介紹了如何使用Python3調(diào)用訊飛WebAPI語音識別接口,重點解決了在處理語音識別結(jié)果時判斷是否為最后一幀的問題,通過運行代碼并總結(jié)經(jīng)驗,解決了常見的模塊和屬性錯誤,需要的朋友可以參考下2025-03-03pytorch中transform.Compose()用法詳解
PyTorch是一個開源的Python機器學(xué)習(xí)庫,基于Torch,用于自然語言處理等應(yīng)用程序,這篇文章主要介紹了pytorch中transform.Compose()用法,需要的朋友可以參考下2023-10-10舉例講解Python設(shè)計模式編程中的訪問者與觀察者模式
這篇文章主要介紹了Python設(shè)計模式編程中的訪問者與觀察者模式,設(shè)計模式的制定有利于團隊協(xié)作編程代碼的協(xié)調(diào),需要的朋友可以參考下2016-01-01