一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

數(shù)據(jù)處理利器

 LibraryPKU 2018-12-02

想入門 Pandas,那么首先需要了解Pandas中的數(shù)據(jù)結(jié)構(gòu)。因為Pandas中數(shù)據(jù)操作依賴于數(shù)據(jù)結(jié)構(gòu)對象。Pandas中最常用的數(shù)據(jù)結(jié)構(gòu)是 Series  DataFrame。這里可以將 Series和 DataFrame分別看作一維數(shù)組和二維數(shù)組。

Series

Series是一維標簽數(shù)組,其可以存儲任何數(shù)據(jù)類型,包括整數(shù),浮點數(shù),字符串等等。所謂標簽數(shù)組,這里的標簽即是指Series的索引。

import pandas as pd

s=pd.Series([5,4,3,2,1], index=['a''c''e'31])


?? 創(chuàng)建時給定了一個列表: [5,4,3,2,1],并且通過 index 參數(shù)用于指定索引。如果僅給定列表,不指定index參數(shù),默認索引為從0開始的數(shù)字。注意:索引標簽為字符串和整數(shù)的混合類型。記住不要使用浮點數(shù)作為索引,并且盡量避免使用混合類型索引。


除了使用傳入列表或numpy數(shù)組之外,也可以通過字典的方式創(chuàng)建:

s=pd.Series({'a':5'b':4'c':3'd':2'e':1})


DataFrame

DataFrame是一種表格型數(shù)據(jù)結(jié)構(gòu),可以看作是具有行列標簽的二維數(shù)組。每列可以是不同類型的數(shù)據(jù),比如數(shù)值,字符串,邏輯值等。

DataFrame的創(chuàng)建有多種方式,比較常用的是通過字典的方式創(chuàng)建,此外,還可以給定數(shù)組,通過指定columns和index參數(shù)創(chuàng)建:

d1=pd.DataFrame({'one':[1,3,5], 'two':[2,4,6]})  # 不指定索引,默認仍從0開始。
d2=pd.DataFrame([[1,2],[3,4],[5,6]], columns=['one''two'], index=['a''b''c'])


簡單的介紹了Series和DataFrame這兩種數(shù)據(jù)結(jié)構(gòu)之后,我們以全國空氣質(zhì)量歷史數(shù)據(jù)(http://beijingair.sinaapp.com)為例,通過實際的數(shù)據(jù)處理來介紹一下常用的操作。


數(shù)據(jù)為逗號分隔的csv格式數(shù)據(jù),數(shù)據(jù)存儲如下:

數(shù)據(jù)存儲形式


數(shù)據(jù)存儲以逗號作為分隔符,列為: date, hour, type, 1001A, 1002A…,date和hour為時間信息列,type為對應(yīng)的要素,其余的列均為站點名稱。


讀取數(shù)據(jù)
data = pd.read_csv('china_sites_20170101.csv', sep=',')

由于文件中存儲了多行多列數(shù)據(jù),因此,完全讀取之后 data 為 DataFrame 類型。


探索性分析

查看DataFrame數(shù)據(jù)信息

data.shape 
data.ndim  # 獲取數(shù)據(jù)的維度信息
data.index  # 獲取索引
data.columns #獲取列名


查看數(shù)據(jù)行列對象信息

data.info() 

class 'pandas.core.frame.DataFrame'>
RangeIndex:
 285 entries, 0 to 284
Columns: 1500 entries, date to 2846A
dtypes: float64(1497), int64(2), object(1)
memory usage: 3.3+ MB

上述數(shù)據(jù)中包含285行,1500列,其中type列為object,date和hour列為int64類型,其余列均為float64類型。memory表明數(shù)據(jù)總共占用了約3.3M內(nèi)存。


數(shù)據(jù)統(tǒng)計信息

獲取每一列的統(tǒng)計相關(guān)數(shù)據(jù),count表示一列的行數(shù),mean表示均值,std為標準差,minmax表示最小值和最大值,25%,50%75%分別表示1/4位數(shù),中位數(shù)和3/4位數(shù)。

data.describe()


?? describte 僅統(tǒng)計數(shù)值型列的統(tǒng)計數(shù)據(jù),對于object列,會直接忽略。

這里還要注意一點:由于type列對應(yīng)了不同的空氣質(zhì)量要素,而不同的空氣質(zhì)量要素具有不同的取值范圍,因此在使用describe查看統(tǒng)計信息時,應(yīng)針對不同的要素進行,這樣才有具體意義,才能看出每個要素的值分布,以及確定是否存在異常值。


簡單的數(shù)據(jù)查看

head 方法可以查看整個數(shù)據(jù)集的前幾行信息,默認是前5行,但可以指定參數(shù)選擇,與 head 對應(yīng)的是 tail 可以查看對應(yīng)的從末尾開始的默認5行數(shù)據(jù)。這兩個方法類似linux中的 head 和 tail 命令。

data.head()
data.tail()


數(shù)據(jù)選擇

簡單的了解了上述信息之后,我們對不同的空氣質(zhì)量要素進行操作時就要涉及到數(shù)據(jù)的選擇。


?? Pandas官方提示:以下切片形式操作在簡單的交互式數(shù)據(jù)分析時是非常友好的,但是如果應(yīng)用于生產(chǎn)環(huán)境盡量使用優(yōu)化后的一些方法:.at,.iat.loc,.iloc.ix等。


Pandas主要有兩種數(shù)據(jù)查詢選擇操作:

  • 基于標簽的查詢

  • 基于整數(shù)的位置索引查詢


Pandas在選擇列時,無需使用 date[:, columns] 的形式,先使用 : 選擇所有行,再指定 columns 列名稱。選擇1001A站點的數(shù)據(jù)。

data[['date''hour''type''1001A']]  # 獲取四列所有行數(shù)據(jù),仍為DataFrame
data[0:5# 選擇所有列前5行數(shù)據(jù),僅包括索引0-4行


超綱題:由于數(shù)據(jù)中包含了時間信息列(date和hour),為了方便操作,我們可以使用以下命令將時間列設(shè)置為索引。

date_index = pd.to_datetime(data.date.apply(lambda x: str(x)) + data.hour.apply(lambda x: '%02d'%x), format='%Y%m%d%H')
data.index = date_index
# data.drop(['date', 'hour], axis=1, inplace=True)  ## 刪除 date和hour列,inplace選項直接針對原DataFrame操作


?? 'date' 和'hour'都是整數(shù),需要將這兩列轉(zhuǎn)換成字符串之后連接起來,連接的時候注意 date 形式是 '%Y%m%d',而 hour 轉(zhuǎn)換的時候要轉(zhuǎn)換成 '0d'的形式,防止數(shù)字為0-9時為單字符,然后使用 pd.to_datetime 函數(shù)轉(zhuǎn)換,需要指定 format 參數(shù),否則轉(zhuǎn)換會出錯。



  • 基于標簽的查詢 .loc

    .loc 主要基于標簽進行數(shù)據(jù)選擇,此外還可以使用邏輯數(shù)組。當所選擇的項不存在時會誘發(fā)異常。

    • 單個標簽

    • data.loc[:, '1001A'# 返回Series 注意 : 行索引,如果僅給定 data.loc['1001A'] 會出錯
    • 標簽數(shù)組

    • data.loc[:, ['1001A''1006A''2706A']]
    • 標簽切片對象

      data.loc['2017-01-01 00:00:00':'2017-01-01 06:00:00''1001A':'1005A']  # 針對行和列均進行切片
      # data.loc[0:5, '1001A':'1005A] # 會出錯

      ?? 由于行索引已經(jīng)轉(zhuǎn)換為時間,因此此處不能使用 整數(shù) 索引。因為 .loc 只能用于行列標簽索引,整數(shù)位置索引需要使用 .iloc。

      針對時間索引,可以直接使用時間的方式來查詢,對于包含時間信息的數(shù)據(jù)檢索來說非常方便

    • 邏輯數(shù)組

    data.loc[data['type'] == 'AQI']  # 選擇所有站點的AQI數(shù)據(jù)
    • 可調(diào)用函數(shù)

      即可以傳入函數(shù)作給 .loc ,但函數(shù)返回結(jié)果應(yīng)是有效的索引,比如標簽或者邏輯數(shù)組

    def test(data, column, name):
        return data[columns] = name

    data.loc[test(data, 'type''AQI')]


  • 基于整數(shù)的位置索引查詢 .iloc

    .iloc  主要是基于整數(shù)的位置索引,也可以使用邏輯數(shù)組的方式。如果索引越界會誘發(fā)IndexError錯誤,但切片索引允許索引越界。

    • 單個整數(shù)

      data.iloc[0]  # 返回第1行的所有列,結(jié)果為Series
    • 整數(shù)數(shù)組

      data.iloc[[0,2,4,6,8], [0,1,2,3]]
    • 整數(shù)切片

      data.iloc[0:100:4]
    • 邏輯數(shù)組

      data.iloc[(data.type == 'AQI').values]  # 獲取所有站點的AQI數(shù)據(jù) 

      ??  由于 data.type == 'AQI' 返回的是 Series,我們只需要獲取其中的值,因此指定 .values 屬性。又超綱了==。

    • 可調(diào)用函數(shù)

      傳入可調(diào)用函數(shù)給 .iloc,函數(shù)返回值應(yīng)為:單個整數(shù),整數(shù)數(shù)組,數(shù)組切片或者邏輯數(shù)組。

    上述兩種數(shù)據(jù)選擇雖是基于DataFrame,但Series也支持同樣的操作,以1001A 站點的AQI數(shù)據(jù)為例:

    s = data.loc[data.type == 'AQI']['1001A']


    由于Series只有一列,因此只需要對行進行索引操作即可,也支持基于標簽和整數(shù)的位置索引方式。

    s.loc['2017-01-01 06:00:00':'2017-01-01 12:00:00']
    s.iloc[2:10]



重建索引

通過觀察1001A站點的Series數(shù)據(jù)可以發(fā)現(xiàn):某些時刻的數(shù)據(jù)缺失。對于時間序列數(shù)據(jù)而言,數(shù)據(jù)的缺失可能會導(dǎo)致分析時出現(xiàn)問題。因為,我們需要補齊所有時刻。

from datetime import datetime

date_new = pd.date_range(datetime(2017110), datetime(20171123), freq='1h')

data.reindex(date_new)  # 重新索引


缺失值

補齊所有時刻之后,我們可以查看一下數(shù)據(jù)的缺失情況:

data.isnull() # 返回邏輯DataFrame,缺失值為True,否則為False
# data.isnull().sum()  # 統(tǒng)計每個站點每個要素的總的缺失數(shù)

data.isnull().sum() 利用了邏輯運算時:True被視為1,F(xiàn)alse被視為0的方式。data.isnull() 相反的是 data.notnull() ,是缺失值為False,否則為True。如果想丟棄缺失值,可使用 .dropna 方法,即 data.dropna()


但對于時間序列而言,一般不選擇直接丟棄缺失時刻,否則可能造成時間缺失,破壞連續(xù)性。因此,可以選擇補齊數(shù)據(jù)。

data.fillna() # fillna 使用給定值和方法進行數(shù)據(jù)填補
data.interpolate() # interpolate 可以通過線性插值等方法通過插值補齊數(shù)據(jù)


統(tǒng)計計算

Pandas中Series和DataFrame均包含一些常用的統(tǒng)計計算方法,比如:

data.mean()  # 計算平均值
data.sum()   # 求和
data.std()   # 計算標準差
data.median() # 獲取中位數(shù)

上述數(shù)據(jù)是2017年1月1日全國所有觀測站觀測的常規(guī)要素逐小時數(shù)據(jù),上面幾個統(tǒng)計命令均是對每個站點每個要素進行計算。此外,也可以對單個站點分時刻計算,比如:

data['1001A'].resample('6h').mean() # 針對1001A站點,進行每6小時求平均

.resample 是重采樣方法,其返回一個對象,然后對此對象執(zhí)行 .mean  求均值方法。 .mean  也可以換為 .sum ,.std 等方法。對于時間跨度比較長的數(shù)據(jù),也可以求逐日平均,逐月平均等等DataFrame.resmaple('1d').mean(), DataFrame.resample('2m').mean()


對行或列應(yīng)用函數(shù): .apply

上面在創(chuàng)建時間索引時便利用了.apply 方法,對date 和 hour列分別進行了數(shù)據(jù)類型的轉(zhuǎn)換,然后將兩個字符串進行了連接,轉(zhuǎn)換為時間。

pd.to_datetime(data.date.apply(lambda x: str(x)) + data.hour.apply(lambda x: '%02d'%x), format='%Y%m%d%H')


字符串函數(shù)

Series中提供了大量的字符串函數(shù),可以對字符串類型的數(shù)據(jù)進行常規(guī)操作。比如想替換字符串,或者轉(zhuǎn)換字符串大小寫等等。

data.type.str.replace('PM2.5''PM2_5'# 或 data.type.replace('PM2.5', 'PM2_5')
data.type.str.lower()


軸轉(zhuǎn)換

目前的數(shù)據(jù)存儲形式是:站點作為列,每個站點的空氣質(zhì)量要素通過 type 列單獨給定。有時候這種存儲形式并不方便,我們想要為以下形式:

即獲取每個站點時,可以直接獲取當前站點的所有要素數(shù)據(jù),而且時間索引也按照單個時刻排列,索引不會出現(xiàn)重復(fù)值,而之前的存儲形式索引會出現(xiàn)重復(fù)。索引重復(fù)會使得某些操作出錯。

我們可以通過 .pivot_table 進行轉(zhuǎn)換:

data.pivot_table(index=data.index, columns=['type'])


索引仍為 data 的原索引,但對 type 列進行旋轉(zhuǎn)。旋轉(zhuǎn)完成之后返回的DataFrame的列為 MultiIndex。而關(guān)于 MultiIndex 的查詢操作屬于高級主題。

對于 MultiIndex 的操作,同樣可以使用.loc 方法,并借助 .IndexSlice 進行索引。


索引切片: 可以理解成 idx 將 MultiIndex 視為一個新的 DataFrame,然后將上層索引視為行,下層索引視為列,以此來進行數(shù)據(jù)的查詢。


idx = pd.IndexSlice

sub=data.loc[:, idx['1001A', ['AQI''PM10''PM2.5']]]

data.loc[:, idx['1001A', ['AQI', 'PM10', 'PM2.5']]]: 表示 data 中的所有行,idx['1001A', ['AQI', 'PM10', 'PM2.5']] 表示 data 中的指定列,如果將 idx 看作新的 DataFrame,那么'1001A'則是 idx 中的行,['AQI', 'PM10', 'PM2.5'] 則是 idx 中的列。


上述操作返回的列仍然是 MultiIndex,因為此時只有一個站點了,我們可以使用 .xs 方法將列從MultiIndex轉(zhuǎn)換為Index。

sub.xs('1001A', axis=1)


簡單繪圖

Python可視化工具概覽 中我們提到過數(shù)據(jù)處理和可視化一條龍服務(wù)的Pandas,Pandas不僅可以進行數(shù)據(jù)處理工作,而且其還封裝了一些繪圖方法。首先導(dǎo)入 matplotlibseaborn,這是為了能夠較好的顯示圖形比例。


import matplotlib.pyplot as plt
import seaborn as sns

sns.set_context('talk', font_scale=1.3)


這里我們選擇單個站點數(shù)據(jù)進行畫圖:

sub = data.loc[:, idx['1001A', :]].xs('1001A', axis=1)

fig, ax = plt.subplots(figsize=(169))
sub.plot.box(ax=ax)


箱線圖

上圖可以看出:不同的要素其值所在范圍是不同的,在探索性分析時應(yīng)分開分析。


除了箱線圖之外,Pandas還可以繪制折線圖,條形圖,餅圖,密度分布等。這在數(shù)據(jù)分析時是比較方便的,但在圖形美化或其他圖形繪制還需要借助其他工具,比如統(tǒng)計繪圖Seaborn更勝一籌??催@里 >>> Python簡單高效的可視化神器——Seaborn


后面會繼續(xù)介紹關(guān)于pandas的更多技巧和高級操作。



數(shù)據(jù): https://pan.baidu.com/s/1whja5oxfMniOGZP3WrBC_A


- End -

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    最新国产欧美精品91| 国产一区二区三区免费福利| 国产内射一级一片内射高清视频| 亚洲最新的黄色录像在线| 久久精品国产99精品亚洲| 欧美乱视频一区二区三区| 91日韩欧美中文字幕| 欧美午夜视频免费观看| 亚洲综合日韩精品欧美综合区| 久久99爱爱视频视频| 亚洲一区二区三区免费的视频| 亚洲国产精品无遮挡羞羞| 精品国产日韩一区三区| 久久这里只有精品中文字幕| 国产日韩欧美国产欧美日韩| 成人精品一区二区三区综合 | 麻豆印象传媒在线观看| 国产又爽又猛又粗又色对黄 | 亚洲日本中文字幕视频在线观看 | 欧美人与动牲交a精品| 国产精品一区二区成人在线| 日韩一区二区三区久久| 国产一区二区久久综合| 欧美激情区一区二区三区| 好东西一起分享老鸭窝| 欧美日韩国产另类一区二区| 日韩中文无线码在线视频| 自拍偷拍一区二区三区| 国产精品白丝久久av| 成人日韩视频中文字幕| 国产精品超碰在线观看| 欧美一区二区黑人在线| 特黄大片性高水多欧美一级| 最近日韩在线免费黄片| 色一情一伦一区二区三| 亚洲熟女少妇精品一区二区三区| 亚洲午夜福利视频在线| 国产在线一区二区免费| 九九九热在线免费视频| 好吊视频一区二区在线| 69精品一区二区蜜桃视频|