數據處理利器pandas入門

2021-02-21 氣象雜貨鋪


想入門 Pandas,那麼首先需要了解Pandas中的數據結構。因為Pandas中數據操作依賴於數據結構對象。Pandas中最常用的數據結構是 Series  DataFrame。這裡可以將 Series和 DataFrame分別看作一維數組和二維數組。

Series

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

import pandas as pd

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

⚠️ 創建時給定了一個列表: [5,4,3,2,1],並且通過 index 參數用於指定索引。如果僅給定列表,不指定index參數,默認索引為從0開始的數字。注意:索引標籤為字符串和整數的混合類型。記住不要使用浮點數作為索引,並且儘量避免使用混合類型索引


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

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


DataFrame

DataFrame是一種表格型數據結構,可以看作是具有行列標籤的二維數組。每列可以是不同類型的數據,比如數值,字符串,邏輯值等。

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

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這兩種數據結構之後,我們以全國空氣品質歷史數據(http://beijingair.sinaapp.com)為例,通過實際的數據處理來介紹一下常用的操作。


數據為逗號分隔的csv格式數據,數據存儲如下:

數據存儲形式

數據存儲以逗號作為分隔符,列為: date, hour, type, 1001A, 1002A…,date和hour為時間信息列,type為對應的要素,其餘的列均為站點名稱。


讀取數據

data = pd.read_csv('china_sites_20170101.csv', sep=',')

由於文件中存儲了多行多列數據,因此,完全讀取之後 data 為 DataFrame 類型。


探索性分析

查看DataFrame數據信息

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


查看數據行列對象信息

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

上述數據中包含285行,1500列,其中type列為object,date和hour列為int64類型,其餘列均為float64類型。memory表明數據總共佔用了約3.3M內存。


數據統計信息

獲取每一列的統計相關數據,count表示一列的行數,mean表示均值,std為標準差,minmax表示最小值和最大值,25%50%75%分別表示1/4位數,中位數和3/4位數。


⚠️ describte 僅統計數值型列的統計數據,對於object列,會直接忽略。

這裡還要注意一點:由於type列對應了不同的空氣品質要素,而不同的空氣品質要素具有不同的取值範圍,因此在使用describe查看統計信息時,應針對不同的要素進行,這樣才有具體意義,才能看出每個要素的值分布,以及確定是否存在異常值。


簡單的數據查看

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

數據選擇

簡單的了解了上述信息之後,我們對不同的空氣品質要素進行操作時就要涉及到數據的選擇。


⚠️ Pandas官方提示:以下切片形式操作在簡單的交互式數據分析時是非常友好的,但是如果應用於生產環境儘量使用優化後的一些方法:.at,.iat,.loc,.iloc,.ix等。


Pandas主要有兩種數據查詢選擇操作:

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

data[['date', 'hour', 'type', '1001A']]  # 獲取四列所有行數據,仍為DataFrame

data[0:5] # 選擇所有列前5行數據,僅包括索引0-4行


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

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'都是整數,需要將這兩列轉換成字符串之後連接起來,連接的時候注意 date 形式是 '%Y%m%d',而 hour 轉換的時候要轉換成 '0d'的形式,防止數字為0-9時為單字符,然後使用 pd.to_datetime 函數轉換,需要指定 format 參數,否則轉換會出錯。


基於標籤的查詢 .loc

.loc 主要基於標籤進行數據選擇,此外還可以使用邏輯數組。當所選擇的項不存在時會誘發異常。

單個標籤

data.loc[:, '1001A'] # 返回Series 注意 : 行索引,如果僅給定 data.loc['1001A'] 會出錯

標籤數組

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] # 會出錯

⚠️ 由於行索引已經轉換為時間,因此此處不能使用 整數 索引。因為 .loc 只能用於行列標籤索引,整數位置索引需要使用 .iloc。

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

data.loc[data['type'] == 'AQI']  # 選擇所有站點的AQI數據

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

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

基於整數的位置索引查詢 .iloc

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

data.iloc[[0,2,4,6,8], [0,1,2,3]]

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

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


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

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

重建索引

通過觀察1001A站點的Series數據可以發現:某些時刻的數據缺失。對於時間序列數據而言,數據的缺失可能會導致分析時出現問題。因為,我們需要補齊所有時刻。

from datetime import datetime

date_new = pd.date_range(datetime(2017, 1, 1, 0), datetime(2017, 1, 1, 23), freq='1h')

data.reindex(date_new)  # 重新索引


缺失值

補齊所有時刻之後,我們可以查看一下數據的缺失情況:

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

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


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

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

統計計算

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

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

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

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

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


對行或列應用函數: .apply

上面在創建時間索引時便利用了.apply 方法,對date 和 hour列分別進行了數據類型的轉換,然後將兩個字符串進行了連接,轉換為時間。

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


字符串函數

Series中提供了大量的字符串函數,可以對字符串類型的數據進行常規操作。比如想替換字符串,或者轉換字符串大小寫等等。

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


軸轉換

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

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

我們可以通過 .pivot_table 進行轉換:

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


索引仍為 data 的原索引,但對 type 列進行旋轉。旋轉完成之後返回的DataFrame的列為 MultiIndex。而關於 MultiIndex 的查詢操作屬於高級主題。

對於 MultiIndex 的操作,同樣可以使用.loc 方法,並藉助 .IndexSlice 進行索引。


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


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轉換為Index。


簡單繪圖

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


import matplotlib.pyplot as plt
import seaborn as sns

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


這裡我們選擇單個站點數據進行畫圖:

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

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


箱線圖

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


除了箱線圖之外,Pandas還可以繪製折線圖,條形圖,餅圖,密度分布等。這在數據分析時是比較方便的,但在圖形美化或其他圖形繪製還需要藉助其他工具,比如統計繪圖Seaborn更勝一籌。看這裡 >>> Python簡單高效的可視化神器——Seaborn


後面會繼續介紹關於pandas的更多技巧和高級操作。


數據: https://pan.baidu.com/s/1whja5oxfMniOGZP3WrBC_A


- End -

本文由MeteoAI原創首發,未經允許禁止轉載!


相關焦點

  • Python數據處理庫pandas入門教程
    本文是對它的一個入門教程。pandas提供了快速,靈活和富有表現力的數據結構,目的是使「關係」或「標記」數據的工作既簡單又直觀。它旨在成為在Python中進行實際數據分析的高級構建塊。入門介紹pandas適合於許多不同類型的數據,包括:由於這是一個Python語言的軟體包,因此需要你的機器上首先需要具備Python語言的環境。關於這一點,請自行在網絡上搜索獲取方法。關於如何獲取pandas請參閱官網上的說明:pandas Installation。
  • Python數據分析利器,Pandas入門介紹,幫你便捷高效處理複雜數據
    關於Python的數據分析,當我們遇到的數據量小、數據結構簡單時,可以通過字典、列表等Python常見的數據結構來處理。但是當我們面對的大量數據以及複雜數據的局面時,就需要用一些專門用於數據分析的擴展庫來處理數據了。今天給大家介紹一個Python裡專門用來做數據分析和處理的擴展庫。
  • 使用Pandas進行數據處理
    引言我們將深入講解pandas庫在數據處理階段的功能數據處理又可以細分為三個階段,我們將通過例子詳細講解各個階段都會涉及哪些操作,以及如何充分利用pandas庫提供的函數來完成這些操作。數據處理的三個階段為:數據準備、數據轉換和數據聚合。數據準備開始處理數據工作之前,需要先行準備好數據,把數據組裝成便於用pandas庫的各種工具處理的數據結構。
  • 數據處理 | pandas入門專題——離散化與one-hot
    今天是pandas數據處理專題第7篇文章,可以點擊上方專輯查看往期文章。假設某一維是收入,那麼它對應的係數顯然必須非常非常小,因為樣本當中有馬雲這種頂級大佬的收入存在,也就是說為了擬合這樣的極端數據,模型被帶跑偏了。這種情況非常多,因為現實生活當中很多數據的分布是非常不均勻的。
  • 懂Excel輕鬆入門Python數據分析包pandas(十七):合併不規範數據
    此系列文章收錄在公眾號中:數據大宇宙 > 數據處理 >E-pd經常聽別人說 Python 在數據領域有多厲害,結果學了很長時間,連數據處理都麻煩得要死。後來才發現,原來不是 Python 數據處理厲害,而是他有數據分析神器—— pandas前言本系列上一篇文章關於合併多個 Excel 數據,許多小夥伴似乎對此比較感興趣,問我是否可以合併不規範的數據,本文就用他們提出的需求做一個大致講解上一節文章:懂Excel就能輕鬆入門Python數據分析包pandas(十六):合併數據奇葩格式
  • pandas入門
    (註:只有第5章--pandas入門部分,使用jupyter notebook打開,代碼已通過測試,後續章節請追隨更新)1、pandas的數據結構       pandas有兩個主要的數據結構:Series和DataFrame。Series是一種類似於一維數組的對象,它由一組數據(各種Numpy數據類型)以及一組與之相關的數據標籤(即索引)組成。
  • 懂Excel就能輕鬆入門Python數據分析包pandas(十五):拆分數據
    此系列文章收錄在公眾號中:數據大宇宙 > 數據處理 >E-pd轉發本文並私信我"python",即可經常聽別人說 Python 在數據領域有多厲害,結果學了很長時間,連數據處理都麻煩得要死。
  • 使用Pandas數據處理與分析
    前言:這是關於個人關於對pandas可以進行的數據處理和數據分析的見解的初版,其中肯定不乏一些錯誤之處,希望大家能多多指正。但是,在一般的數據處理分析中,往往自我生成數據情況較少,更多的是導入數據。pandas提供了一些用於將表格型數據讀取為DataFrame對象的函數。
  • Pandas對文本數據處理
    在處理數據的時候,對數值型的數據處理還是比較方便的,但是有時候數值型數據出現問題後就會比較頭痛了,因為文本數據的排列組合可是有很多很多的,今天我們就學習一下如何對文本數據進行處理,這樣我們接下來在工作中遇到了這些情況就可以少掉一下頭髮啦。
  • pandas讀取表格後的常用數據處理操作
    pandas讀取表格後的一些常用數據處理操作。這篇文章其實來源於自己的數據挖掘課程作業,通過完成老師布置的作業,感覺對於使用python中的pandas模塊讀取表格數據進行操作有了更深層的認識,這裡做一個整理總結。
  • Pandas三大利器-map、apply、applymap
    作者:Peter出品:尤而小屋Pandas
  • 用pandas處理時間格式數據
    本文2023字,預計閱讀需10分鐘;我們在處理時間相關的數據時有很多庫可以用,最常用的還是內置的datetime、time這兩個。
  • Python 數據處理庫 pandas 入門教程
    本文是對它的一個入門教程。pandas提供了快速,靈活和富有表現力的數據結構,目的是使「關係」或「標記」數據的工作既簡單又直觀。它旨在成為在Python中進行實際數據分析的高級構建塊。入門介紹pandas適合於許多不同類型的數據,包括:由於這是一個Python語言的軟體包,因此需要你的機器上首先需要具備Python語言的環境。
  • 關於Pandas數據處理你不知道的技巧!
    旗下高端量化雲平臺當我們參加一些比賽時,我們可能要花費大量時間來處理數據。本文將由淺到深,為大家講解關於Pandas在數據清理和處理的一些技巧!,因為它不像Boston房價數據(Kaggle最經典的題目)集那樣處理得很好。
  • 數據處理技巧 | 帶你了解Pandas.groupby() 常用數據處理方法
    今天我們繼續推出一篇數據處理常用的操作技能匯總:靈活使用pandas.groupby()函數,實現數據的高效率處理,主要內容如下:pandas.groupby()三大主要操作介紹說到使用Python進行數據處理分析,那就不得不提其優秀的數據分析庫-Pandas,
  • Python數學建模技巧之pandas數據處理
    最常見的庫有進行矩陣運算的Numpy、進行數據處理的pandas、進行科學計算的Scipy、進行圖形繪製及科學可視化的matplotlib、進行符號計算的Sympy以及方便進行機器學習任務的Sklearn。由於今年美賽官方公告中稱,將會提前在賽題公布之前就提供下載C題數據集的方式。
  • python數據分析常用庫之pandas入門(2)
    索引、選擇和賦值昨天介紹了pandas的模塊引入、創建和讀取數據,今天主要看看怎麼從數據結構中獲得想要的值,也就是數據的索引查找、
  • pandas | 使用pandas進行數據處理——DataFrame篇
    今天是pandas數據處理專題的第二篇文章,我們一起來聊聊pandas當中最重要的數據結構——DataFrame。並且為我們提供了許多表級別數據處理以及批量數據處理的接口,大大降低了數據處理的難度。雖然DataFrame可以近似看成是Series組合成的dict,但實際上它作為一個單獨的數據結構,也擁有許多自己的api,支持許多花式的操作,是我們處理數據強有力的工具。
  • pandas+PyQt5輕鬆製作數據處理工具
    作者:才哥由於在工作中需要處理很多日誌文件數據,這些數據並不存在於資料庫,而是以每日1個單文件的形式存在,為了讓我們在日常數據處理中更方便的進行一些基礎的數據合併、清洗篩選以及簡單的分組或數據透視處理,結合PyQt5與pandas庫,製作了一個簡單的數據處理可視化工具。
  • Pandas數據處理120題,你在第幾層?
    作者|劉早起Pandas進階修煉120題系列一共涵蓋了數據處理、計算、可視化等常用操作,希望通過120道精心挑選的習題吃透pandas。