九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
22個案例詳解Pandas數(shù)據(jù)分析/預(yù)處理時的實用技巧,超簡單

作者:俊欣

來源:關(guān)于數(shù)據(jù)分析與可視化

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

  • Pandas計算交叉列表
  • Pandas將字符串與數(shù)值轉(zhuǎn)化成時間類型
  • Pandas將字符串轉(zhuǎn)化成數(shù)值類型

Pandas當(dāng)中的交叉列表

首先我們來講一下Pandas模塊當(dāng)中的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名。

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

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()方法當(dāng)中的margin參數(shù),如下

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

output

顧客類型   會員   普通   All省份                  上海    124  115   239北京    116  127   243.....江蘇     18   15    33浙江    119  111   230黑龍江    14   17    31All   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.......

如上所示,我們所要計算的是地處“上?!辈⑶沂恰皶T”顧客的總收入的平均值,除了平均值之外,還有其他的聚合函數(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:251   2016-11-26 21:30:052   2017-03-22 15:16:45Name: 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-101   1974-01-202   1974-01-30Name: 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當(dāng)中的時間日期格式化符號

  • %y 兩位數(shù)的年份表示(00-99)
  • %Y 四位數(shù)的年份表示(000-9999)
  • %m 表示的是月份(01-12)
  • %d 表示的是一個月當(dāng)中的一天(0-31)
  • %H 表示的是24小時制的小時數(shù)
  • %I 表示的是12小時制的小時數(shù)
  • %M 表示的是分鐘數(shù) (00-59)
  • %S 表示的是秒數(shù)(00-59)
  • %w 表示的是星期數(shù),一周當(dāng)中的第幾天,從星期天開始算
  • %W 表示的是一年中的星期數(shù)

當(dāng)然我們進行數(shù)據(jù)類型轉(zhuǎn)換遇到錯誤的時候,pd.to_datetime()方法當(dāng)中的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 value0 3/10/2000 21 a/11/2000 32 3/12/2000 4

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

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

output

date value0 2000-03-10 21 NaT 32 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      objectint_col          int64float_col      float64mix_col         objectmissing_col    float64money_col       objectboolean_col       boolcustom          objectdtype: object

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

df.info()

output

<class 'pandas.core.frame.DataFrame'>RangeIndex: 4 entries, 0 to 3Data 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      float64 3   mix_col      4 non-null      object  4   missing_col  3 non-null      float64 5   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       int32int_col          int64float_col      float64mix_col         objectmissing_col    float64money_col       objectboolean_col       boolcustom          objectdtype: object

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

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

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

output

string_col     float64int_col          int64float_col      float64mix_col         objectmissing_col    float64money_col       objectboolean_col       boolcustom          objectdtype: object

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

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

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

output

當(dāng)中有一個字符串的數(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     float64int_col          int64float_col      float64mix_col        float64missing_col    float64money_col       objectboolean_col       boolcustom          objectdtype: 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.01    2400.02    2400.03    2400.0Name: 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' })
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
機器學(xué)習(xí)開放課程(一):使用Pandas探索數(shù)據(jù)分析
Python 數(shù)據(jù)分析:讓你像寫 Sql 語句一樣,使用 Pandas 做數(shù)據(jù)分析
pandas 讀寫 Excel
Pandas數(shù)據(jù)挖掘與分析時的常用方法
Pandas使用自定義函數(shù)
每天五分鐘Python數(shù)據(jù)分析——Pandas 數(shù)據(jù)篩選
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服