python數(shù)據(jù)處理和數(shù)據(jù)清洗的示例詳解
1.庫的相關(guān)簡(jiǎn)介
python里面是通過模塊體現(xiàn)庫的,可以降低程序員的使用成本,提高程序的開發(fā)效率;
標(biāo)準(zhǔn)庫:官方提供的;
第三方庫:其他的大佬做出來的(數(shù)量龐大);
2.數(shù)據(jù)處理之添加新列
import pandas as pd df = pd.read_csv("/Users/feifei/hotpot.csv") # 計(jì)算性價(jià)比評(píng)分,通過賦值,將結(jié)果添加為df的"性價(jià)比評(píng)分"列 df["性價(jià)比評(píng)分"] = (df["口味評(píng)分"]/df["人均消費(fèi)"])*40 # 計(jì)算氛圍評(píng)分,通過賦值,將結(jié)果添加為df的"氛圍評(píng)分"列 df["氛圍評(píng)分"] = (df["服務(wù)評(píng)分"]+df["環(huán)境評(píng)分"])/2 # 使用print()輸出df print(df)
什么叫做添加新列,就是我們?cè)跀?shù)學(xué)建模對(duì)于數(shù)據(jù)集合進(jìn)行處理的時(shí)候,對(duì)于海量的數(shù)據(jù),我們可能會(huì)根據(jù)這個(gè)已知的數(shù)據(jù)添加新的變量之類的,這個(gè)新的變量就是我們通過已知的數(shù)據(jù)得到的新的數(shù)據(jù)變量;
在上面這個(gè)案例里面,我們通過一個(gè)店鋪的口味評(píng)分和人均消費(fèi)凝練出來一個(gè)性價(jià)比評(píng)分作為新的數(shù)據(jù)變量,根據(jù)這個(gè)店鋪的服務(wù)評(píng)分和環(huán)境評(píng)分凝練出來這個(gè)氛圍的評(píng)分作為新的數(shù)據(jù)變量,最后這兩個(gè)新的變量就會(huì)作為新的表頭顯示在我們?cè)瓉淼臄?shù)據(jù)表格里面去;
3.處理結(jié)果的小數(shù)位數(shù)的處理
我們想要對(duì)于這個(gè)處理結(jié)果的小數(shù)的位數(shù)進(jìn)行控制,我們可以使用一個(gè)函數(shù):
因?yàn)檫@個(gè)里面是進(jìn)行的多列索引,這個(gè)時(shí)候我們使用了這個(gè)索引的嵌套,round(2)表示對(duì)于所選擇的數(shù)據(jù)進(jìn)行保留兩位小數(shù)的處理,并且更新原來的數(shù)據(jù);
import pandas as pd df = pd.read_csv("/Users/feifei/hotpot.csv") # 計(jì)算性價(jià)比評(píng)分,通過賦值,將結(jié)果添加為df的"性價(jià)比評(píng)分"列 df["性價(jià)比評(píng)分"] = (df["口味評(píng)分"]/df["人均消費(fèi)"])*40 # 計(jì)算氛圍評(píng)分,通過賦值,將結(jié)果添加為df的"氛圍評(píng)分"列 df["氛圍評(píng)分"] = (df["服務(wù)評(píng)分"]+df["環(huán)境評(píng)分"])/2 # TODO 使用round()函數(shù)對(duì)2個(gè)新列保留2位小數(shù) df[["性價(jià)比評(píng)分","氛圍評(píng)分"]] = df[["性價(jià)比評(píng)分","氛圍評(píng)分"]].round(2) # 使用print()輸出df print(df)
4.對(duì)于某一列的數(shù)據(jù)進(jìn)行排序
我們上面綜合得到了這個(gè)性價(jià)比評(píng)分和氛圍評(píng)分,我們想要根據(jù)這兩個(gè)指標(biāo)進(jìn)行這個(gè)店鋪的排名
sort_values就是一個(gè)函數(shù)的調(diào)用,by=""表示的是對(duì)于某一列的內(nèi)容進(jìn)行處理,ascending=False表示的就是以降序的形式進(jìn)行排序,如果我們沒有寫這個(gè)參數(shù)或者是等于true,都是以升序的形式進(jìn)行排序;
# 使用sort_values()對(duì)df的"性價(jià)比評(píng)分"列進(jìn)行降序排序,并賦值給df_1 df_1 = df.sort_values(by="性價(jià)比評(píng)分",ascending=False) # 使用sort_values()對(duì)df的"氛圍評(píng)分"列進(jìn)行降序排序,并賦值給df_2 df_2 = df.sort_values(by="氛圍評(píng)分",ascending=False) # 使用print()輸出df_1 print(df_1) # 使用print()輸出df_2 print(df_2)
5.選擇我們想要的數(shù)據(jù)集合
我們的排序也完成了,接下來的就是只保留這個(gè)店鋪的名稱和性價(jià)比,并且打印顯示出來前面的10名店鋪?zhàn)鳛槲覀兊淖罴堰x擇;
head函數(shù)就會(huì)篩選出來前面的10個(gè)店鋪打印出來,df_atmospyere這個(gè)里面存儲(chǔ)的就是我們想要的兩列的數(shù)據(jù)集合;
# TODO 使用sort_values()對(duì)df的列"氛圍評(píng)分"進(jìn)行降序排序,并賦值給df_2 df_2 = df.sort_values(by="氛圍評(píng)分",ascending=False) # TODO 使用多列索引的方式,訪問df_2的"店鋪名稱"和"氛圍評(píng)分"2列,并賦值給df_atmosphere df_atmosphere = df_2[["店鋪名稱","氛圍評(píng)分"]] # TODO 使用print()輸出df_atmosphere的前10行 print(df_atmosphere.head(10))
6.臟數(shù)據(jù)的介紹
6.1背景介紹
臟數(shù)據(jù)包括異常值,缺失值和重復(fù)值,把臟數(shù)據(jù)篩選出來,進(jìn)行修正,填補(bǔ)的工作的過程,就是數(shù)據(jù)的清洗;
我們想要去處理這些臟的數(shù)據(jù),就要首先導(dǎo)入這個(gè)pandas模塊,進(jìn)行文件的讀取,然后進(jìn)行這個(gè)數(shù)據(jù)集的格式轉(zhuǎn)換,把這個(gè)里面的數(shù)據(jù)類型,單位進(jìn)行修改;
下面的這個(gè)是一個(gè)平臺(tái)的會(huì)員開通情況數(shù)據(jù)集合:
上面的這個(gè)就是我們要處理的數(shù)據(jù)大致情況,因?yàn)閿?shù)據(jù)量很大,我們只截取出來這個(gè)里面的一小部分?jǐn)?shù)據(jù),簡(jiǎn)單的說明一下,這個(gè)表頭的實(shí)際含義,分別是訂單的編號(hào),用戶的id,價(jià)格(以分為單位),支付平臺(tái),支付渠道,支付方式,交易時(shí)間,支付時(shí)間;
6.2時(shí)間序列轉(zhuǎn)換
# 導(dǎo)入pandas模塊,簡(jiǎn)稱為pd import pandas as pd # 讀取路徑為"/Users/clean/視頻會(huì)員訂單數(shù)據(jù)源.csv"的文件,賦值給變量df df = pd.read_csv("/Users/clean/視頻會(huì)員訂單數(shù)據(jù)源.csv") # 商品價(jià)格price,單位分轉(zhuǎn)化成元 df['price'] = df['price'] /100 # 使用to_datetime()函數(shù),將訂單創(chuàng)建時(shí)間create_time,轉(zhuǎn)化成時(shí)間格式 df['create_time'] = pd.to_datetime(df['create_time']) # TODO 使用to_datetime()函數(shù),將訂單支付時(shí)間pay_time,轉(zhuǎn)化成時(shí)間格式 df['pay_time'] = pd.to_datetime(df['pay_time']) # 輸出此時(shí)的df print(df)
上面做的工作就是在原來的表格的基礎(chǔ)上面進(jìn)行這個(gè)單位的修改,把原來以分為單位的數(shù)據(jù)轉(zhuǎn)換為以元為單位,把這個(gè)訂單的兩個(gè)時(shí)間全部轉(zhuǎn)換為時(shí)間格式:使用to_datatime函數(shù);
7.數(shù)據(jù)清洗
7.1快速瀏覽數(shù)據(jù)
我們上面已經(jīng)完成了準(zhǔn)備的工作,就是把這個(gè)相關(guān)的單位進(jìn)行修正,和我們的這個(gè)時(shí)間序列的轉(zhuǎn)換
下面我們使用這個(gè)info函數(shù)快速地瀏覽全部數(shù)據(jù),確定每一列的數(shù)據(jù)的缺失情況,這個(gè)函數(shù)相當(dāng)于print打印功能,顯示出來存在的數(shù)據(jù)個(gè)數(shù),通過這個(gè)打印結(jié)果,我們就可以發(fā)現(xiàn),其他列的數(shù)據(jù)全部是78049,而這個(gè)platform這一列卻是77645,這個(gè)時(shí)候我們就可以知道那些列缺失了多少的數(shù)據(jù),因?yàn)榇蟛糠值臄?shù)據(jù)都是完整的,只需要找出與眾不同的數(shù)字;
7.2找到缺失值
我們上面已經(jīng)確定這個(gè)數(shù)據(jù)是存在缺失的情況的,但是我們應(yīng)該如何找到缺失數(shù)據(jù)的具體的位置呢
我們可以使用insull函數(shù):找到一列里面每一行的數(shù)據(jù)是否缺失;
8.分類對(duì)于缺失的數(shù)據(jù)進(jìn)行處理
數(shù)據(jù)缺失了怎么辦,直接刪除還是補(bǔ)全,針對(duì)于這個(gè)數(shù)據(jù)的多少和數(shù)據(jù)的重要程度,我們需要分情況進(jìn)行處理;
如果是對(duì)于我們的研究很重要的數(shù)據(jù),我們刪除顯然是不合適的;
但是如果一個(gè)數(shù)據(jù)集合有幾十萬的數(shù)據(jù),我們刪除幾百個(gè)也是無傷大雅的:drop函數(shù);
如果缺失值的數(shù)量較多,并且缺失值所在的這一列(這一個(gè)屬性),并不是我們分析的重點(diǎn)時(shí),可以對(duì)缺失值進(jìn)行補(bǔ)全:fillna函數(shù);
8.1對(duì)于缺失值的刪除
我們首先篩選出來這個(gè)缺失值所在的行標(biāo),存儲(chǔ)到dfPayNull這個(gè)series里面;
接下來使用drop函數(shù)進(jìn)行數(shù)據(jù)的刪除(刪除行),參數(shù)就是我們得到的這個(gè)dfpaynull的index索引
# 使用布爾索引和isnull函數(shù),將payment_provider這一列的缺失值篩選出,賦值給變量dfPayNull # dfPayNull就是,包含所有payment_provider這一列缺失值的行 dfPayNull = df[df['payment_provider'].isnull()] # TODO 使用drop函數(shù),將dfPayNull,也就是包含所有payment_provider這一列缺失值的行刪除 df.drop(index=dfPayNull.index,inplace=True) # 使用df.info(),快速瀏覽數(shù)據(jù)集 df.info()
8.2對(duì)于缺失值的填充
df['platform']使我們需要填充的列對(duì)象,這個(gè)對(duì)象去調(diào)用fillna函數(shù),參數(shù)有兩個(gè),第一個(gè)就是填充的內(nèi)容,第二個(gè)就是缺失的行標(biāo);
# TODO 使用fillna()函數(shù),用"unknown"填充platform的缺失值 df['platform'].fillna("unknown",inplace=True) # 輸出df.info() df.info()
9.分析處理異常值
9.1一般處理
首先是一些比較明顯的異常值:例如這個(gè)id肯定不可能是負(fù)數(shù),這個(gè)時(shí)候?qū)τ趇d<0這個(gè)判斷條件對(duì)于異常值進(jìn)行刪選。但是更多的是下面的情況:
這個(gè)時(shí)候我們需要使用一個(gè)函數(shù)進(jìn)行處理:isin()函數(shù)
9.2特殊情況
我們使用這個(gè)函數(shù)篩選出來不是某些數(shù)據(jù)的索引,我們使用這個(gè)函數(shù),異常數(shù)據(jù)返回的是false,這個(gè)時(shí)候我們使用取反運(yùn)算符,當(dāng)這個(gè)返回false就是我們認(rèn)定的異常值;
9.3交易時(shí)間的篩選
交易時(shí)間必須在提交訂單時(shí)間的后面,這個(gè)才是正常的,這個(gè)可以作為一個(gè)判斷條件;
# TODO 使用布爾索引,將支付時(shí)間pay_time小于創(chuàng)建時(shí)間create_time的異常值篩選出來,賦值給變量dfWrongTime dfWrongTime = df[df['pay_time'] < df['create_time']] # 使用print輸出dfWrongTime print(dfWrongTime)
10.分析處理重復(fù)值
pandas的duplicated()
函數(shù)專門對(duì)重復(fù)值進(jìn)行處理。
duplicated()函數(shù),判斷重復(fù)的機(jī)制,是會(huì)把出現(xiàn)相同值的第二個(gè)及以后的數(shù)據(jù),判斷為True
這樣,保證每個(gè)數(shù)據(jù)都保留一個(gè)唯一值。
# 使用布爾索引、duplicated函數(shù),將order_id這一列的重復(fù)值篩選出來,賦值給變量dfOrderDu dfOrderDu = df[df['order_id'].duplicated()]
以上就是python數(shù)據(jù)處理和數(shù)據(jù)清洗的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于python數(shù)據(jù)處理和清洗的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python數(shù)學(xué)建模PuLP庫線性規(guī)劃入門示例詳解
這篇文章主要為大家介紹了Python數(shù)學(xué)建模PuLP庫線性規(guī)劃入門示例詳解,想學(xué)習(xí)關(guān)于Python建模的同學(xué)可以學(xué)習(xí)參考下,希望能夠有所幫助2021-10-10Python基于更相減損術(shù)實(shí)現(xiàn)求解最大公約數(shù)的方法
這篇文章主要介紹了Python基于更相減損術(shù)實(shí)現(xiàn)求解最大公約數(shù)的方法,簡(jiǎn)單說明了更相減損術(shù)的概念、原理并結(jié)合Python實(shí)例形式分析了基于更相減損術(shù)實(shí)現(xiàn)求解最大公約數(shù)的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-04-04python連接遠(yuǎn)程ftp服務(wù)器并列出目錄下文件的方法
這篇文章主要介紹了python連接遠(yuǎn)程ftp服務(wù)器并列出目錄下文件的方法,實(shí)例分析了Python使用pysftp模塊的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04ChatGPT 幫我自動(dòng)編寫 Python 爬蟲腳本的詳細(xì)過程
ChatGPT是一種基于大語言模型的生成式AI,換句話說它可以自動(dòng)生成類似人類語言的文本,把梳理好的有邏輯的答案呈現(xiàn)在你面前,這完全不同于傳統(tǒng)搜索工具,這篇文章主要介紹了ChatGPT 幫我自動(dòng)編寫 Python 爬蟲腳本,需要的朋友可以參考下2023-02-02python通過apply使用元祖和列表調(diào)用函數(shù)實(shí)例
這篇文章主要介紹了python通過apply使用元祖和列表調(diào)用函數(shù),實(shí)例分析了python中apply方法的使用技巧,需要的朋友可以參考下2015-05-05