欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用python數(shù)據(jù)清洗代碼實例

 更新時間:2023年07月10日 10:51:37   作者:dogyii  
這篇文章主要介紹了使用python數(shù)據(jù)清洗代碼實例,分享一下近期用python做數(shù)據(jù)清洗匯總的相關(guān)代碼,這里我們用到的python包有pandas、numpy、os等,需要的朋友可以參考下

數(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論