導航:首頁 > 源碼編譯 > pandaspython演算法

pandaspython演算法

發布時間:2023-02-08 03:46:51

python數據分析: 初識Pandas,理解Pandas實現和原理

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理

01 重要的前言

這段時間和一些做數據分析的同學閑聊,我發現數據分析技能入門階段存在一個普遍性的問題,很多憑著興趣入坑的同學,都能夠很快熟悉Python基礎語法,然後不約而同的一頭扎進《利用Python進行數據分析》這本經典之中,硬著頭皮啃完之後,好像自己什麼都會了一點,然而實際操作起來既不知從何操起,又漏洞百出。

至於原因嘛,理解不夠,實踐不夠是兩條老牌的攔路虎,只能靠自己來克服。還有一個非常有意思且經常被忽視的因素——陷入舉三反一的懵逼狀態。

什麼意思呢?假如我是個旱鴨子,想去學游泳,教練很認真的給我剖析了蛙泳的動作,扶著我的腰讓我在水裡劃拉了5分鍾,接著馬上給我講解了蝶泳,又是劃拉了5分鍾,然後又硬塞給我潛泳的姿勢,依然是劃拉5分鍾。最後,教練一下子把我丟進踩不到底的泳池,給我吶喊助威。

作為一個還沒入門的旱鴨子,教練傾囊授了我3種游泳技巧,讓我分別實踐了5分鍾。這樣做的結果就是我哪一種游泳技巧也沒學會,只學會了喝水。當一個初學者一開始就陷入針對單個問題的多種解決方法,而每一種方法的實踐又淺嘗輒止,在面對具體問題時往往會手忙腳亂。

拿Pandas來說,它的多種構造方式,多種索引方式以及類似效果的多種實現方法,很容易把初學者打入舉三反一的懵逼狀態。所以,盡量避開這個坑也是我寫Pandas基礎系列的初衷,希望通過梳理和精簡知識點的方式,給需要的同學一些啟發。目前暫定整個基礎系列分為4篇,基礎篇過後便是有趣的實戰篇。

下面開始進入正題(我真是太嘮叨了)。

02 Pandas簡介

江湖上流傳著這么一句話——分析不識潘大師(PANDAS),縱是老手也枉然。

Pandas是基於Numpy的專業數據分析工具,可以靈活高效的處理各種數據集,也是我們後期分析案例的神器。它提供了兩種類型的數據結構,分別是DataFrame和Series,我們可以簡單粗暴的把DataFrame理解為Excel裡面的一張表,而Series就是表中的某一列,後面學習和用到的所有Pandas騷操作,都是基於這些表和列進行的操作(關於Pandas和Excel的形象關系,這里推薦我的好朋友張俊紅寫的《對比EXCEL,輕松學習Python數據分析》)。

這里有一點需要強調,Pandas和Excel、SQL相比,只是調用和處理數據的方式變了,核心都是對源數據進行一系列的處理,在正式處理之前,更重要的是謀定而後動,明確分析的意義,理清分析思路之後再處理和分析數據,往往事半功倍。

03 創建、讀取和存儲

1、創建

在Pandas中我們想要構造下面這一張表應該如何操作呢?

別忘了,第一步一定是先導入我們的庫——import pandas as pd

構造DataFrame最常用的方式是字典+列表,語句很簡單,先是字典外括,然後依次打出每一列標題及其對應的列值(此處一定要用列表),這里列的順序並不重要:

左邊是jupyter notebook中dataframe的樣子,如果對應到excel中,他就是右邊表格的樣子,通過改變columns,index和values的值來控制數據。

PS,如果我們在創建時不指定index,系統會自動生成從0開始的索引。

2、 讀取

更多時候,我們是把相關文件數據直接讀進PANDAS中進行操作,這里介紹兩種非常接近的讀取方式,一種是CSV格式的文件,一種是EXCEL格式(.xlsx和xls後綴)的文件。

讀取csv文件:

engine是使用的分析引擎,讀取csv文件一般指定python避免中文和編碼造成的報錯。而讀取Excel文件,則是一樣的味道:

非常easy,其實read_csv和read_excel還有一些參數,比如header、sep、names等,大家可以做額外了解。實踐中數據源的格式一般都是比較規整的,更多情況是直接讀取。

3、存儲

存儲起來一樣非常簡單粗暴且相似:

04 快速認識數據

這里以我們的案例數據為例,迅速熟悉查看N行,數據格式概覽以及基礎統計數據。

1、查看數據,掐頭看尾

很多時候我們想要對數據內容做一個總覽,用df.head()函數直接可以查看默認的前5行,與之對應,df.tail()就可以查看數據尾部的5行數據,這兩個參數內可以傳入一個數值來控制查看的行數,例如df.head(10)表示查看前10行數據。

2、 格式查看

df.info()幫助我們一步摸清各列數據的類型,以及缺失情況:

從上面直接可以知道數據集的行列數,數據集的大小,每一列的數據類型,以及有多少條非空數據。

3、統計信息概覽

快速計算數值型數據的關鍵統計指標,像平均數、中位數、標准差等等。

我們本來有5列數據,為什麼返回結果只有兩列?那是因為這個操作只針對數值型的列。其中count是統計每一列的有多少個非空數值,mean、std、min、max對應的分別是該列的均值、標准差、最小值和最大值,25%、50%、75%對應的則是分位數。

05 列的基本處理方式

這里,我們採用SQL四大法寶的邏輯來簡單梳理針對列的基本處理方式——增、刪、選、改。

溫馨提示:使用Pandas時,盡量避免用行或者EXCEL操作單元格的思維來處理數據,要逐漸養成一種列向思維,每一列是同宗同源,處理起來是嗖嗖的快。

1、增

增加一列,用df[『新列名』] = 新列值的形式,在原數據基礎上賦值即可:

2、刪:

我們用drop函數制定刪除對應的列,axis = 1表示針對列的操作,inplace為True,則直接在源數據上進行修改,否則源數據會保持原樣。

3、選:

想要選取某一列怎麼辦?df[『列名』]即可:

選取多列呢?需要用列表來傳遞:df[[『第一列』,『第二列』,『第三列』…]]

4、 改:

好事多磨,復雜的針對特定條件和行列的篩選、修改,放在後面結合案例細講,這里只講一下最簡單的更改:df[『舊列名』] = 某個值或者某列值,就完成了對原列數值的修改。

06 常用數據類型及操作

1、字元串

字元串類型是最常用的格式之一了,Pandas中字元串的操作和原生字元串操作幾乎一毛一樣,唯一不同的是需要在操作前加上".str"。

小Z溫馨提示:我們最初用df2.info()查看數據類型時,非數值型的列都返回的是object格式,和str類型深層機制上的區別就不展開了,在常規實際應用中,我們可以先理解為object對應的就是str格式,int64對應的就是int格式,float64對應的就是float格式即可。

在案例數據中,我們發現來源明細那一列,可能是系統導出的歷史遺留問題,每一個字元串前面都有一個「-」符號,又丑又無用,所以把他給拿掉:

一般來說清洗之後的列是要替換掉原來列的:

2、 數值型

數值型數據,常見的操作是計算,分為與單個值的運算,長度相等列的運算。

以案例數據為例,源數據訪客數我們是知道的,現在想把所有渠道的訪客都加上10000,怎麼操作呢?

只需要選中訪客數所在列,然後加上10000即可,pandas自動將10000和每一行數值相加,針對單個值的其他運算(減乘除)也是如此。

列之間的運算語句也非常簡潔。源數據是包含了訪客數、轉化率和客單價,而實際工作中我們對每個渠道貢獻的銷售額更感興趣。(銷售額 = 訪客數 X 轉化率 X 客單價)

對應操作語句:df[『銷售額』] = df[『訪客數』] * df[『轉化率』] * df[『客單價』]

但為什麼瘋狂報錯?

導致報錯的原因,是數值型數據和非數值型數據相互計算導致的。PANDAS把帶「%」符號的轉化率識別成字元串類型,我們需要先拿掉百分號,再將這一列轉化為浮點型數據:

要注意的是,這樣操作,把9.98%變成了9.98,所以我們還需要讓支付轉化率除以100,來還原百分數的真實數值:

然後,再用三個指標相乘計算銷售額:

3、時間類型

PANDAS中時間序列相關的水非常深,這里只對日常中最基礎的時間格式進行講解,對時間序列感興趣的同學可以自行查閱相關資料,深入了解。

以案例數據為例,我們這些渠道數據,是在2019年8月2日提取的,後面可能涉及到其他日期的渠道數據,所以需要加一列時間予以區分,在EXCEL中常用的時間格式是』2019-8-3』或者』2019/8/3』,我們用PANDAS來實現一下:

在實際業務中,一些時候PANDAS會把文件中日期格式的欄位讀取為字元串格式,這里我們先把字元串』2019-8-3』賦值給新增的日期列,然後用to_datetime()函數將字元串類型轉換成時間格式:

轉換成時間格式(這里是datetime64)之後,我們可以用處理時間的思路高效處理這些數據,比如,我現在想知道提取數據這一天離年末還有多少天(『2019-12-31』),直接做減法(該函數接受時間格式的字元串序列,也接受單個字元串):

② python:pandas計算時間差

import pandas as pd

方法一:
先利用to_datetime轉換為時間格式,tm列的數據形式為'yyyy-MM-dd HH:mm:ss'
df['tm_1'] = pd.to_datetime(df['tm_1'])

df['tm_2'] = pd.to_datetime(df['tm_2'])

利用".dt.seconds"轉換為秒,除以相對於的間隔數得到分鍾、小時等
df['diff_time'] = (df['tm_1'] - df['tm_2']).dt.seconds/3600

利用round函數可進行四捨五入
df['diff_time'] = round(df['diff_time'])

方法二,日期相減變為小時;變為天的話將h替換為D即可:
df['diff_time'] = (df['tm_1'] - df['tm_2']).values/np.timedelta64(1, 'h')

③ Python pandas數據計數函數value_counts

value_counts是一種查看錶格某列中有多少個不同值的快捷方法,並計算每個不同值有在該列中個數,類似Excel裡面的count函數

其是pandas下面的頂層函數,也可以作用在Series、DataFrame下

常規用法:

pandas 的 value_counts() 函數可以對Series裡面的每個值進行計數 並且 排序,默認是降序

可以看出,既可以對分類變數統計,也可以對連續數值變數統計

如果是要對結果升序排列,可以添加 ascending=True 來改變

如果不想看統計的個數,而是想看佔比,那麼可以設置 normalize=True 即可,結果是小數形式

可以通過apply,對每一列變數進行統計

以上是自己實踐中遇到的一些點,分享出來供大家參考學習,歡迎關注DataShare公眾號

④ 新手關於python中pandas函數的使用

利用Python的pandas數據結構來讀取excel表格的數據,部分代碼如下:

#-*- coding:utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt

catering_data="catering_sale.xls"
data=pd.read_excel(catering_data,index_col=u'日期')
#讀取數據,指定"日期"列為索引列

大多數書上都是這樣寫的,但是在Python2.7上運行時出現錯誤。(沒有在Python3.x版本試過)
出現了如下問題:
這里寫圖片描述
使用help(pd.read_excel)發現參數中有必選參數sheetname,加入到函數中,代碼如下:

#-*- coding:utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt

catering_data="catering_sale.xls"
data=pd.read_excel(catering_data,sheetname=0,index_col=u'日期')

運行成功。
sheetname=0 的意思是:讀取xls文件中的第一個表格。(假設文件中有很多個表格)
另外,也可以將文件轉換成csv格式,就不需要這個參數了。代碼如下:

catering_data="catering_sale.csv"
data=pd.read_csv(catering_data)

⑤ python--pandas分組聚合

groupby 方法是pandas中的分組方法,對數據框採用 groupby 方法後,返回的是 DataFrameGroupBy 對象,一般分組操作後會進行聚合操作。

對數據框按 A 列進行分組,產生分組數據框。分組數據框是可迭代對象,可以進行循環遍歷,可以看出在循環中,每個元素的類型是元組,
元組的第一個元素是分組值,第二個元素是對應的分組數據框。

可以對分組後的數據框直接使用聚合方法 agg ,對分組數據框的每一列計算統計函數值。

可以根據數據框外的序列數據對數據框進行分組,需要注意 序列長度需要與數據框行數相同

可以根據數據框的多列對數據框進行分組。

根據 A , B 列進行分組,然後求和。

可以根據索引對數據框進行分組,需要設置 level 參數。

數據框只有一層索引,設置參數 level=0 。

當數據框索引有多層時,也可以根據需求設置 level 參數,完成分組聚合。

設置 level 參數,如需要根據第一層索引,即 id1 進行分組,可以設置 level=0 或 level='id1' 完成分組聚合。

分組後一般會進行聚合操作,用 agg 方法進行聚合。

對分組後數據框使用單個函數進行聚合,單個聚合函數會對每列進行計算,然後合並返回。聚合函數以字元串的形式傳入。

可以對分組後的數據指定列進行分組聚合。需要注意 子列需要用[]包裹

聚合函數也可以傳入自定義的匿名函數。

聚合函數可以是多個函數。聚合時,多個聚合函數會對每列進行計算,然後合並返回。聚合函數以列表的形式傳入。

聚合返回後的數據列名有兩層索引,第一層是聚合的列名,第二層是使用的聚合函數名。如果需要對返回的聚合函數名重命名,
需要在傳參時,傳入元組,第一個元素為聚合函數名,第二個元素為聚合函數。

同樣,也可以傳入匿名函數。

如果需要對不同的列進行不同的聚合計算,則需要傳入字典的形式。

可以重命名聚合後的列名,注意 只能對一列傳入一個聚合函數時有效

⑥ python(pandas模塊)

Pandas是Python的一個數據分析包,最初由AQR Capital
Management於2008年4月開發,並於2009年底開源出來,目前由專注於Python數據包開發的Pydata開發team繼續開發和維護,屬於PyData項目的一部分,pandas最初被作為金融數據分析工具而開發出來,因此pandas為時間序列分析提供了很好的支持。

Pandas的名稱來自於面板數據和python數據分析。panel
data是經濟學中關於多維數據集的一個術語,在Pandas中也提供了panel的數據類型。

Pandas數據結構:

Series:一維數組,與numpy中的一維array類似。二者與Python基本的數據結構list相近,Series如今能保存不同種數據類型,字元串、boolean值、數字等都能保存在series中。

Time-series:以時間為索引的series。

DataFrame:二維的表格型數據結構,很多功能與R中的data.frame類似,可以將DataFrame理解為Series的容器。

Panel :三維的數組,可以理解為DataFrame的容器。

Panel4D:是像Panel一樣的4維數據容器。

PanelND:擁有factory集合,可以創建像Panel4D一樣N維命名容器的模塊。

⑦ Python Pandas——Read_csv詳解

可以指定整個DataFrame或各個列的數據類型:

pandas提供了多種方法來確保列僅包含一個dtype。例如,可以使用read_csv()的converters參數:

或者,可以在讀取數據後使用to_numeric()函數強進行類型轉換。

可以通過指定dtype ='category'或dtype = CategoricalDtype(類別,有序)直接解析類別列。

可以使用dict指定將某列為Category類型:

指定dtype ='category'將導致無序分類,其類別是數據中觀察到的唯一值。

要更好地控制類別和順序,可以創建CategoricalDtype,然後將其傳遞給該列的dtype。

使用dtype = CategoricalDtype時,dtype.categories之外的「意外」值將被視為缺失值。

文件可能包含標題行,也可能沒有標題行。 pandas假定第一行應用作列名:

通過指定name與header,可以重命名列以及是否丟棄標題行:

如果標題不在第一行中,則將行號傳遞給標題,將跳過header前面的行:

如果文件或標題包含重復的名稱,默認情況下,pandas會將它們區分開,以防止覆蓋數據.

usecols參數允許您使用列名,位置號或可調用的方法選擇文件中列的任何子集.

如果指定了comment參數,則將忽略注釋行。 默認情況下,空行也將被忽略。

如果skip_blank_lines = False,則read_csv將不會忽略空行:

警告:被忽略的行的存在可能會導致涉及行號的歧義; 參數標題使用行號(忽略注釋/空行),而行首使用行號(包括注釋/空行).

如果同時指定了skiprows和header,則header將相對於skiprows的末尾。 例如:

為了更好地使用日期時間數據,read_csv()使用關鍵字參數parse_dates和date_parser允許用戶指定列的日期/時間格式,將string轉換為日期時間對象。

通常,我們可能希望分別存儲日期和時間數據,或分別存儲各種日期欄位。 parse_dates關鍵字可用於指定列的組合,以從中解析日期和/或時間。 您可以指定要parse_dates的列或嵌套列表,結果日期列將被添加到輸出的前面(以便不影響現有的列順序),新的列名為各列Name的連接。

默認情況下,解析器會刪除組件日期列,可以選擇通過keep_date_col關鍵字保留它們:

請注意,如果您希望將多個列合並為一個日期列,則必須使用嵌套列表。 換句話說,parse_dates = [1,2]表示第二和第三列應分別解析為單獨的日期列,而parse_dates = [[1,2]]意味著應將這兩列解析為單個列。

還可以使用字典來指定自定義名稱列:

重要的是要記住,如果要將多個文本列解析為單個日期列,則在數據前添加一個新列。

index_col參數基於這組新列而不是原始數據列:

注意:如果列或索引包含不可解析的日期,則整個列或索引將作為對象數據類型原樣返回。 對於非標准日期時間解析,請在pd.read_csv之後使用to_datetime()。

注意:read_csv具有用於解析iso8601格式的日期時間字元串的fast_path,例如「 2000-01-01T00:01:02 + 00:00」和類似的變體。 如果可以安排數據以這種格式存儲日期時間,則載入時間將明顯縮短,約20倍。

最後,解析器允許您指定自定義date_parser函數,以充分利用日期解析API的靈活性:

Pandas不能原生表示具有混合時區的列或索引。 如果CSV文件包含帶有時區混合的列,則默認結果將是帶有字元串的object-dtype列,即使包含parse_dates。

要將混合時區值解析為datetime列,請將部分應用的to_datetime()傳遞給utc = True作為date_parser。

⑧ Python之pandas數據整理及分組統計

對數據進行整理以及分組統計

一、數據整理

1、行、列的插入與刪除

2、索引整理

3、重復值處理

4、排序,排名

5、數據框連接

6、數據分段

pandas.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)

x:需要切分的數據

bins:切分區域

right : 是否包含右端點默認True,包含

labels:對應標簽,用標記來代替返回的bins,若不在該序列中,則返回NaN

retbins:是否返回間距bins

precision:精度

include_lowest:是否包含左端點,默認False,不包含

7、多級索引

8、字元串處理

類似於Python

二、分組統計

閱讀全文

與pandaspython演算法相關的資料

熱點內容
不能從文件夾看到迅雷 瀏覽:138
編程處理表格有意義嗎 瀏覽:438
java字元串回車換行 瀏覽:155
普通分體空調是什麼壓縮機 瀏覽:824
數控車床牙刀滾花編程實例 瀏覽:944
辦公室pdf 瀏覽:279
自動化測量和編程 瀏覽:588
827編程教學 瀏覽:726
跳轉到文件夾 瀏覽:518
文件夾怎麼解壓並安裝 瀏覽:402
壓縮機維修論壇 瀏覽:8
加密碼的筆記本app 瀏覽:685
伺服器ac是怎麼填 瀏覽:474
編譯原理短語可以是句子嗎 瀏覽:652
電腦版燈塔app怎麼下載 瀏覽:554
我的魂斗羅歸來怎麼安卓轉蘋果 瀏覽:150
iphone怎麼隱藏app內容 瀏覽:954
移動手機怎麼修改登錄密碼app 瀏覽:582
兩點間中點垂直線cad命令 瀏覽:32
dpdk編程開發 瀏覽:978