日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Python】6000字、22个案例详解Pandas数据分析/预处理时的实用技巧,超简单

發(fā)布時間:2025/3/12 python 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python】6000字、22个案例详解Pandas数据分析/预处理时的实用技巧,超简单 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

上兩篇原創(chuàng)的文章,小編主要是講了數(shù)據(jù)可視化方面的內(nèi)容,但是好像看得人不是很多的樣子(搞得小編心里拔涼拔涼的....)

  • 【硬核干貨】4500字、10個案例分享幾個Python可視化小技巧,助你繪制高質(zhì)量圖表

  • 【硬核干貨】| 3000字推薦一個可視化神器,50行Python代碼制作數(shù)據(jù)大屏

今天小編打算來講一講數(shù)據(jù)分析方面的內(nèi)容,整理和總結(jié)一下Pandas在數(shù)據(jù)預(yù)處理和數(shù)據(jù)分析方面的硬核干貨,我們大致會說

  • Pandas計算交叉列表

  • Pandas將字符串與數(shù)值轉(zhuǎn)化成時間類型

  • Pandas將字符串轉(zhuǎn)化成數(shù)值類型

Pandas當中的交叉列表

首先我們來講一下Pandas模塊當中的crosstab()函數(shù),它的作用主要是進行分組之后的信息統(tǒng)計,里面會用到聚合函數(shù),默認的是統(tǒng)計行列組合出現(xiàn)的次數(shù),參數(shù)如下

pandas.crosstab(index,?columns,values=None,rownames=None,colnames=None,aggfunc=None,margins=False,margins_name='All',dropna=True,normalize=False)

下面小編來解釋一下里面幾個常用的函數(shù)

  • index: 指定了要分組的類目,作為行

  • columns: 指定了要分組的類目,作為列

  • rownames/colnames: 行/列的名稱

  • aggfunc: 指定聚合函數(shù)

  • values: 最終在聚合函數(shù)之下,行與列一同計算出來的值

  • normalize: 標準化統(tǒng)計各行各列的百分比

我們通過幾個例子來進一步理解corss_tab()函數(shù)的作用,我們先導(dǎo)入要用到的模塊并且讀取數(shù)據(jù)集

import?pandas?as?pddf?=?pd.read_excel(io="supermarkt_sales.xlsx",engine="openpyxl",sheet_name="Sales",skiprows=3,usecols="B:R",nrows=1000, )

output

我們先簡單來看幾個corsstab()函數(shù)的例子,代碼如下

pd.crosstab(df['城市'],?df['顧客類型'])

output

顧客類型???會員???普通 省份???????????? 上海????124??115 北京????116??127 四川?????26???35 安徽?????28???12 廣東?????30???36 .......

這里我們將省份指定為行索引,將會員類型指定為列,其中顧客類型有“會員”、“普通”兩種,舉例來說,四川省的會員顧客有26名,普通顧客有35名。

當然我們這里只是指定了一個列,也可以指定多個,代碼如下

pd.crosstab(df['省份'],?[df['顧客類型'],?df["性別"]])

output

顧客類型??會員??????普通???? 性別????女性??男性??女性??男性 省份?????????????????? 上海????67??57??53??62 北京????53??63??59??68 四川????17???9??16??19 安徽????17??11???9???3 廣東????18??12??15??21 .....

這里我們將顧客類型進行了細分,有女性會員、男性會員等等,那么同理,對于行索引我們也可以指定多個,這里也就不過多進行演示。

有時候我們想要改變行索引的名稱或者是列方向的名稱,我們則可以這么做

pd.crosstab(df['省份'],?df['顧客類型'],colnames?=?['顧客的類型'],rownames?=?['各省份名稱'])

output

顧客的類型??會員???普通 各省份名稱???????????? 上海????124??115 北京????116??127 四川?????26???35 安徽?????28???12 廣東?????30???36

要是我們想在行方向以及列方向上加一個匯總的列,就需要用到crosstab()方法當中的margin參數(shù),如下

pd.crosstab(df['省份'],?df['顧客類型'],?margins?=?True)

output

顧客類型???會員???普通???All 省份?????????????????? 上海????124??115???239 北京????116??127???243 ..... 江蘇?????18???15????33 浙江????119??111???230 黑龍江????14???17????31 All???501??499??1000

你也可以給匯總的那一列重命名,用到的是margins_name參數(shù),如下

pd.crosstab(df['省份'],?df['顧客類型'],margins?=?True,?margins_name="匯總")

output

顧客類型???會員???普通???匯總 省份?????????????????? 上海????124??115???239 北京????116??127???243 ..... 江蘇?????18???15????33 浙江????119??111???230 黑龍江????14???17????31 匯總???501??499??1000

而如果我們需要的數(shù)值是百分比的形式,那么就需要用到normalize參數(shù),如下

pd.crosstab(df['省份'],?df['顧客類型'],normalize=True)

output

顧客類型?????會員?????普通 省份???????????????? 上海????0.124??0.115 北京????0.116??0.127 四川????0.026??0.035 安徽????0.028??0.012 廣東????0.030??0.036 .......

要是我們更加傾向于是百分比,并且保留兩位小數(shù),則可以這么來做

pd.crosstab(df['省份'],?df['顧客類型'],normalize=True).style.format('{:.2%}')

output

顧客類型??會員???普通 省份???????????????? 上海?????12.4%???11.5% 北京?????11.6%???12.7% 四川?????26%?????35% 安徽?????28%?????12% 廣東?????30%?????36% .......

下面我們指定聚合函數(shù),并且作用在我們指定的列上面,用到的參數(shù)是aggfunc參數(shù)以及values參數(shù),代碼如下

pd.crosstab(df['省份'],?df['顧客類型'],values?=?df["總收入"],aggfunc?=?"mean")

output

顧客類型?????????會員?????????普通 省份???????????????????????? 上海????15.648738??15.253248 北京????14.771259??14.354390 四川????20.456135??14.019029 安徽????10.175893??11.559917 廣東????14.757083??18.331903 .......

如上所示,我們所要計算的是地處“上海”并且是“會員”顧客的總收入的平均值,除了平均值之外,還有其他的聚合函數(shù),如np.sum加總或者是np.median求取平均值。

我們還可以指定保留若干位的小數(shù),使用round()函數(shù)

df_1?=?pd.crosstab(df['省份'],?df['顧客類型'],values=df["總收入"],aggfunc="mean").round(2)

output

顧客類型?????會員?????普通 省份???????????????? 上海????15.65??15.25 北京????14.77??14.35 四川????20.46??14.02 安徽????10.18??11.56 廣東????14.76??18.33 .......

時間類型數(shù)據(jù)的轉(zhuǎn)化

對于很多數(shù)據(jù)分析師而言,在進行數(shù)據(jù)預(yù)處理的時候,需要將不同類型的數(shù)據(jù)轉(zhuǎn)換成時間格式的數(shù)據(jù),我們來看一下具體是怎么來進行

首先是將整形的時間戳數(shù)據(jù)轉(zhuǎn)換成時間類型,看下面的例子

df?=?pd.DataFrame({'date':?[1470195805,?1480195805,?1490195805],'value':?[2,?3,?4]}) pd.to_datetime(df['date'],?unit='s')

output

0???2016-08-03?03:43:25 1???2016-11-26?21:30:05 2???2017-03-22?15:16:45 Name:?date,?dtype:?datetime64[ns]

上面的例子是精確到秒,我們也可以精確到天,代碼如下

df?=?pd.DataFrame({'date':?[1470,?1480,?1490],'value':?[2,?3,?4]}) pd.to_datetime(df['date'],?unit='D')

output

0???1974-01-10 1???1974-01-20 2???1974-01-30 Name:?date,?dtype:?datetime64[ns]

下面則是將字符串轉(zhuǎn)換成時間類型的數(shù)據(jù),調(diào)用的也是pd.to_datetime()方法

pd.to_datetime('2022/01/20',?format='%Y/%m/%d')

output

Timestamp('2022-01-20?00:00:00')

亦或是

pd.to_datetime('2022/01/12?11:20:10',format='%Y/%m/%d?%H:%M:%S')

output

Timestamp('2022-01-12?11:20:10')

這里著重介紹一下Python當中的時間日期格式化符號

  • %y 兩位數(shù)的年份表示(00-99)

  • %Y 四位數(shù)的年份表示(000-9999)

  • %m 表示的是月份(01-12)

  • %d 表示的是一個月當中的一天(0-31)

  • %H 表示的是24小時制的小時數(shù)

  • %I 表示的是12小時制的小時數(shù)

  • %M 表示的是分鐘數(shù) (00-59)

  • %S 表示的是秒數(shù)(00-59)

  • %w 表示的是星期數(shù),一周當中的第幾天,從星期天開始算

  • %W 表示的是一年中的星期數(shù)

當然我們進行數(shù)據(jù)類型轉(zhuǎn)換遇到錯誤的時候,pd.to_datetime()方法當中的errors參數(shù)就可以派上用場,

df?=?pd.DataFrame({'date':?['3/10/2000',?'a/11/2000',?'3/12/2000'],'value':?[2,?3,?4]}) #?會報解析錯誤 df['date']?=?pd.to_datetime(df['date'])

output

我們來看一下errors參數(shù)的作用,代碼如下

df['date']?=?pd.to_datetime(df['date'],?errors='ignore') df

output

date??????value 0?3/10/2000???2 1?a/11/2000???3 2?3/12/2000???4

或者將不準確的值轉(zhuǎn)換成NaT,代碼如下

df['date']?=?pd.to_datetime(df['date'],?errors='coerce') df

output

date???????value 0?2000-03-10???2 1?NaT??????????3 2?2000-03-12???4

數(shù)值類型的轉(zhuǎn)換

接下來我們來看一下其他數(shù)據(jù)類型往數(shù)值類型轉(zhuǎn)換所需要經(jīng)過的步驟,首先我們先創(chuàng)建一個DataFrame數(shù)據(jù)集,如下

df?=?pd.DataFrame({'string_col':?['1','2','3','4'],'int_col':?[1,2,3,4],'float_col':?[1.1,1.2,1.3,4.7],'mix_col':?['a',?2,?3,?4],'missing_col':?[1.0,?2,?3,?np.nan],'money_col':?['£1,000.00','£2,400.00','£2,400.00','£2,400.00'],'boolean_col':?[True,?False,?True,?True],'custom':?['Y',?'Y',?'N',?'N']})

output

我們先來查看一下每一列的數(shù)據(jù)類型

df.dtypes

output

string_col??????object int_col??????????int64 float_col??????float64 mix_col?????????object missing_col????float64 money_col???????object boolean_col???????bool custom??????????object dtype:?object

可以看到有各種類型的數(shù)據(jù),包括了布爾值、字符串等等,或者我們可以調(diào)用df.info()方法來調(diào)用,如下

df.info()

output

<class?'pandas.core.frame.DataFrame'> RangeIndex:?4?entries,?0?to?3 Data?columns?(total?8?columns):#???Column???????Non-Null?Count??Dtype?? ---??------???????--------------??-----??0???string_col???4?non-null??????object?1???int_col??????4?non-null??????int64??2???float_col????4?non-null??????float643???mix_col??????4?non-null??????object?4???missing_col??3?non-null??????float645???money_col????4?non-null??????object?6???boolean_col??4?non-null??????bool???7???custom???????4?non-null??????object? dtypes:?bool(1),?float64(2),?int64(1),?object(4) memory?usage:?356.0+?bytes

我們先來看一下從字符串到整型數(shù)據(jù)的轉(zhuǎn)換,代碼如下

df['string_col']?=?df['string_col'].astype('int') df.dtypes

output

string_col???????int32 int_col??????????int64 float_col??????float64 mix_col?????????object missing_col????float64 money_col???????object boolean_col???????bool custom??????????object dtype:?object

看到數(shù)據(jù)是被轉(zhuǎn)換成了int32類型,當然我們指定例如astype('int16')、astype('int8')或者是astype('int64'),當我們碰到量級很大的數(shù)據(jù)集時,會特別的有幫助。

那么類似的,我們想要轉(zhuǎn)換成浮點類型的數(shù)據(jù),就可以這么來做

df['string_col']?=?df['string_col'].astype('float') df.dtypes

output

string_col?????float64 int_col??????????int64 float_col??????float64 mix_col?????????object missing_col????float64 money_col???????object boolean_col???????bool custom??????????object dtype:?object

同理我們也可以指定轉(zhuǎn)換成astype('float16')、astype('float32')或者是astype('float128')

而如果數(shù)據(jù)類型的混合的,既有整型又有字符串的,正常來操作就會報錯,如下

df['mix_col']?=?df['mix_col'].astype('int')

output

當中有一個字符串的數(shù)據(jù)"a",這個時候我們可以調(diào)用pd.to_numeric()方法以及里面的errors參數(shù),代碼如下

df['mix_col']?=?pd.to_numeric(df['mix_col'],?errors='coerce') df.head()

output

我們來看一下各列的數(shù)據(jù)類型

df.dtypes

output

string_col?????float64 int_col??????????int64 float_col??????float64 mix_col????????float64 missing_col????float64 money_col???????object boolean_col???????bool custom??????????object dtype:?object

"mix_col"這一列的數(shù)據(jù)類型被轉(zhuǎn)換成了float64類型,要是我們想指定轉(zhuǎn)換成我們想要的類型,例如

df['mix_col']?=?pd.to_numeric(df['mix_col'],?errors='coerce').astype('Int64') df['mix_col'].dtypes

output

Int64Dtype()

而對于"money_col"這一列,在字符串面前有一個貨幣符號,并且還有一系列的標簽符號,我們先調(diào)用replace()方法將這些符號給替換掉,然后再進行數(shù)據(jù)類型的轉(zhuǎn)換

df['money_replace']?=?df['money_col'].str.replace('£',?'').str.replace(',','') df['money_replace']?=?pd.to_numeric(df['money_replace']) df['money_replace']

output

0????1000.0 1????2400.0 2????2400.0 3????2400.0 Name:?money_replace,?dtype:?float64

要是你熟悉正則表達式的話,也可以通過正則表達式的方式來操作,通過調(diào)用regex=True的參數(shù),代碼如下

df['money_regex']?=?df['money_col'].str.replace('[\£\,]',?'',?regex=True) df['money_regex']?=?pd.to_numeric(df['money_regex']) df['money_regex']

另外我們也可以通過astype()方法,對多個列一步到位進行數(shù)據(jù)類型的轉(zhuǎn)換,代碼如下

df?=?df.astype({'string_col':?'float16','int_col':?'float16' })

或者在第一步數(shù)據(jù)讀取的時候就率先確定好數(shù)據(jù)類型,代碼如下

df?=?pd.read_csv('dataset.csv',?dtype={'string_col':?'float16','int_col':?'float16'} )往期精彩回顧適合初學者入門人工智能的路線及資料下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統(tǒng)計學習方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載本站qq群955171419,加入微信群請掃碼:

總結(jié)

以上是生活随笔為你收集整理的【Python】6000字、22个案例详解Pandas数据分析/预处理时的实用技巧,超简单的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。