天天看點

Python大資料處理子產品Pandas

Pandas使用一個二維的資料結構DataFrame來表示表格式的資料,相比較于Numpy,Pandas可以存儲混合的資料結構,同時使用NaN來表示缺失的資料,而不用像Numpy一樣要手工處理缺失的資料,并且Pandas使用軸标簽來表示行和列

1、檔案讀取

首先将用到的pandas和numpy加載進來

import pandas as pd

import numpy as np

讀取資料:

#csv和xlsx分别用read_csv和read_xlsx,下面以csv為例

df=pd.read_csv('f:\1024.csv') 

2、檢視資料

df.head()  

#預設出5行,括号裡可以填其他資料

3、檢視資料類型

df.dtypes

4、利用現有資料生成一列新資料

比如:max_time和min_time是現有的兩列,現在業務需要生成一列gs,gs=max_time-min_time

df.['gs']=df.['max_time']-['min_time']

#檢視是否成功

df.head()

5、檢視基本統計量

df.describe(include='all')                 # all代表需要将所有列都列出

通常來說,資料是CSV格式,就算不是,至少也可以轉換成CSV格式。在Python中,我們的操作如下:

# Reading data locally

df = pd.read_csv('/Users/al-ahmadgaidasaad/Documents/d.csv')

# Reading data from web

data_url = "https://raw.githubusercontent.com/alstat/Analysis-with-Programming/master/2014/Python/Numerical-Descriptions-of-the-Data/data.csv"

df = pd.read_csv(data_url)

為了讀取本地CSV檔案,我們需要pandas這個資料分析庫中的相應子產品。

其中的read_csv函數能夠讀取本地和web資料。

# Head of the data

print df.head()

# OUTPUT

    Abra  Apayao  Benguet  Ifugao  Kalinga

0   1243    2934      148    3300    10553

1   4158    9235     4287    8063    35257

2   1787    1922     1955    1074     4544

3  17152   14501     3536   19607    31687

4   1266    2385     2530    3315     8520

# Tail of the data

print df.tail()

     Abra  Apayao  Benguet  Ifugao  Kalinga

74   2505   20878     3519   19737    16513

75  60303   40065     7062   19422    61808

76   6311    6756     3561   15910    23349

77  13345   38902     2583   11096    68663

78   2623   18264     3745   16787    16900

上述操作等價于通過print(head(df))來列印資料的前6行,以及通過print(tail(df))來列印資料的後6行。

當然Python中,預設列印是5行,而R則是6行。是以R的代碼head(df, n = 10),

在Python中就是df.head(n = 10),列印資料尾部也是同樣道理。

在Python中,我們則使用columns和index屬性來提取,如下:

# Extracting column names

print df.columns

Index([u'Abra', u'Apayao', u'Benguet', u'Ifugao', u'Kalinga'], dtype='object')

# Extracting row names or the index

print df.index

Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], dtype='int64')

資料轉置使用T方法,

# Transpose data

print df.T

            0      1     2      3     4      5     6      7     8      9  

Abra      1243   4158  1787  17152  1266   5576   927  21540  1039   5424  

Apayao    2934   9235  1922  14501  2385   7452  1099  17038  1382  10588  

Benguet    148   4287  1955   3536  2530    771  2796   2463  2592   1064  

Ifugao    3300   8063  1074  19607  3315  13134  5134  14226  6842  13828  

Kalinga  10553  35257  4544  31687  8520  28252  3106  36238  4973  40140  

         ...       69     70     71     72     73     74     75     76     77  

Abra     ...    12763   2470  59094   6209  13316   2505  60303   6311  13345  

Apayao   ...    37625  19532  35126   6335  38613  20878  40065   6756  38902  

Benguet  ...     2354   4045   5987   3530   2585   3519   7062   3561   2583  

Ifugao   ...     9838  17125  18940  15560   7746  19737  19422  15910  11096  

Kalinga  ...    65782  15279  52437  24385  66148  16513  61808  23349  68663  

            78  

Abra      2623  

Apayao   18264  

Benguet   3745  

Ifugao   16787  

Kalinga  16900  

其他變換,例如排序就是用sort屬性。現在我們提取特定的某列資料。

Python中,可以使用iloc或者ix屬性。但是我更喜歡用ix,因為它更穩定一些。假設我們需資料第一列的前5行,我們有:

print df.ix[:, 0].head()

0     1243

1     4158

2     1787

3    17152

4     1266

Name: Abra, dtype: int64

順便提一下,Python的索引是從0開始而非1。為了取出從11到20行的前3列資料,我們有:

print df.ix[10:20, 0:3]

    Abra  Apayao  Benguet

10    981    1311     2560

11  27366   15093     3039

12   1100    1701     2382

13   7212   11001     1088

14   1048    1427     2847

15  25679   15661     2942

16   1055    2191     2119

17   5437    6461      734

18   1029    1183     2302

19  23710   12222     2598

20   1091    2343     2654

上述指令相當于df.ix[10:20, ['Abra', 'Apayao', 'Benguet']]。

為了舍棄資料中的列,這裡是列1(Apayao)和列2(Benguet),我們使用drop屬性,如下:

print df.drop(df.columns[[1, 2]], axis = 1).head()

    Abra  Ifugao  Kalinga

0   1243    3300    10553

1   4158    8063    35257

2   1787    1074     4544

3  17152   19607    31687

4   1266    3315     8520

axis 參數告訴函數到底舍棄列還是行。如果axis等于0,那麼就舍棄行。

統計描述

下一步就是通過describe屬性,對資料的統計特性進行描述:

print df.describe()

               Abra        Apayao      Benguet        Ifugao       Kalinga

count     79.000000     79.000000    79.000000     79.000000     79.000000

mean   12874.379747  16860.645570  3237.392405  12414.620253  30446.417722

std    16746.466945  15448.153794  1588.536429   5034.282019  22245.707692

min      927.000000    401.000000   148.000000   1074.000000   2346.000000

25%     1524.000000   3435.500000  2328.000000   8205.000000   8601.500000

50%     5790.000000  10588.000000  3202.000000  13044.000000  24494.000000

75%    13330.500000  33289.000000  3918.500000  16099.500000  52510.500000

max    60303.000000  54625.000000  8813.000000  21031.000000  68663.000000

Python有一個很好的統計推斷包。那就是scipy裡面的stats。ttest_1samp實作了單樣本t檢驗。是以,如果我們想檢驗資料Abra列的稻谷産量均值,通過零假設,這裡我們假定總體稻谷産量均值為15000,我們有:

 from scipy import stats as ss

# Perform one sample t-test using 1500 as the true mean

print ss.ttest_1samp(a = df.ix[:, 'Abra'], popmean = 15000)

(-1.1281738488299586, 0.26270472069109496)

傳回下述值組成的元祖:

t : 浮點或數組類型

t統計量

prob : 浮點或數組類型

two-tailed p-value 雙側機率值

通過上面的輸出,看到p值是0.267遠大于α等于0.05,是以沒有充分的證據說平均稻谷産量不是150000。将這個檢驗應用到所有的變量,同樣假設均值為15000,我們有:

print ss.ttest_1samp(a = df, popmean = 15000)

(array([ -1.12817385,   1.07053437, -65.81425599,  -4.564575  ,   6.17156198]),

array([  2.62704721e-01,   2.87680340e-01,   4.15643528e-70,

          1.83764399e-05,   2.82461897e-08]))

第一個數組是t統計量,第二個數組則是相應的p值。

可視化

Python中有許多可視化子產品,最流行的當屬matpalotlib庫。稍加提及,我們也可選擇bokeh和seaborn子產品。之前的博文中,我已經說明了matplotlib庫中的盒須圖子產品功能。

# Import the module for plotting

import matplotlib.pyplot as plt

plt.show(df.plot(kind = 'box'))

現在,我們可以用pandas子產品中內建R的ggplot主題來美化圖表。要使用ggplot,我們隻需要在上述代碼中多加一行,

pd.options.display.mpl_style = 'default' # Sets the plotting display theme to ggplot2

df.plot(kind = 'box')

# Import the seaborn library

import seaborn as sns

# Do the boxplot

plt.show(sns.boxplot(df, widths = 0.5, color = "pastel"))

import scipy.stats as ss

def case(n = 10, mu = 3, sigma = np.sqrt(5), p = 0.025, rep = 100):

    m = np.zeros((rep, 4))

    for i in range(rep):

        norm = np.random.normal(loc = mu, scale = sigma, size = n)

        xbar = np.mean(norm)

        low = xbar - ss.norm.ppf(q = 1 - p) * (sigma / np.sqrt(n))

        up = xbar + ss.norm.ppf(q = 1 - p) * (sigma / np.sqrt(n))

        if (mu > low) & (mu < up):

            rem = 1

        else:

            rem = 0

        m[i, :] = [xbar, low, up, rem]

    inside = np.sum(m[:, 3])

    per = inside / rep

    desc = "There are " + str(inside) + " confidence intervals that contain "

           "the true mean (" + str(mu) + "), that is " + str(per) + " percent of the total CIs"

    return {"Matrix": m, "Decision": desc}

def case2(n = 10, mu = 3, sigma = np.sqrt(5), p = 0.025, rep = 100):

    scaled_crit = ss.norm.ppf(q = 1 - p) * (sigma / np.sqrt(n))

    norm = np.random.normal(loc = mu, scale = sigma, size = (rep, n))

    xbar = norm.mean(1)

    low = xbar - scaled_crit

    up = xbar + scaled_crit

    rem = (mu > low) & (mu < up)

    m = np.c_[xbar, low, up, rem]

Pandas使用函數read_csv()來讀取csv檔案

Python大資料處理子產品Pandas
Python大資料處理子產品Pandas

該檔案的内容如下:

Python大資料處理子產品Pandas

使用函數head( m )來讀取前m條資料,如果沒有參數m,預設讀取前五條資料

由于DataFrame包含了很多的行和列,

Pandas使用省略号(...)來代替顯示全部的行和列,可以使用colums屬性來顯示全部的列名

Python大資料處理子產品Pandas

# 輸出:輸出全部的列名,而不是用省略号代替

Python大資料處理子產品Pandas

可以使用tolist()函數轉化為list

與Numpy一樣,用shape屬性來顯示資料的格式

與Numpy一樣,用dtype屬性來顯示資料類型,Pandas主要有以下幾種dtype:

object -- 代表了字元串類型

int -- 代表了整型

float -- 代表了浮點數類型

datetime -- 代表了時間類型

bool -- 代表了布爾類型

當讀取了一個檔案之後,Pandas會通過分析值來推測每一列的資料類型

Python大資料處理子產品Pandas

輸出:每一列對應的資料類型

NDB_No            int64

Shrt_Desc           object

Water_(g)           float64

Energ_Kcal          int64

Protein_(g)          float64

...

讀取了檔案後,Pandas會把檔案的一行作為列的索引标簽,使用行數字作為行的索引标簽

Python大資料處理子產品Pandas

注意,行标簽是從數字0開始的

Pandas使用Series資料結構來表示一行或一列的資料,類似于Numpy使用向量來表示資料。Numpy隻能使用數字來索引,而Series可以使用非數字來索引資料,當你選擇傳回一行資料的時候,Series并不僅僅傳回該行的資料,同時還有每一列的标簽的名字。

譬如要傳回檔案的第一行資料,Numpy就會傳回一個清單(但你可能不知道每一個數字究竟代表了什麼)

Python大資料處理子產品Pandas

而Pandas則會同時把每一列的标簽名傳回(此時就很清楚資料的意思了)

Python大資料處理子產品Pandas

Pandas使用loc[]方法來選擇行的資料

Python大資料處理子產品Pandas
Python大資料處理子產品Pandas

現在要按照如下公式計算所有食物的健康程度,并按照降序的方式排列結果:

Score=2×(Protein_(g))0.75×(Lipid_Tot_(g))

對DataFrame中的某一列資料進行算術運算,其實是對該列中的所有元素進行逐一的運算,譬如:

water_energy = food_info["Water_(g)"] * food_info["Energ_Kcal"]

原理:

Python大資料處理子產品Pandas

由于每一列的資料跨度太大,有的資料是從0到100000,而有的資料是從0到10,是以為了盡量減少資料尺度對運算結果的影響,采取最簡單的方法來規範化資料,那就是将每個數值都除以該列的最大值,進而使所有資料都處于0和1之間。其中max()函數用來擷取該列的最大值.

Python大資料處理子產品Pandas

讀寫csv資料

<code>df =</code><code>pd.read_csv(path)</code>: 讀入csv檔案,形成一個資料框(data.frame)

<code>df = pd.read_csv(path, header=None)</code> 不要把第一行作為header

* 注意,預設會将第一行作為header,并且預設會添加index,是以不需要的話需要手動禁用 *

<code>df.to_csv(path, header=False, index=False)</code>

df.head(1) 讀取頭幾條資料

df.tail(1) 讀取後幾條資料

df[‘date’] 擷取資料框的date列

df.head(1)[‘date’] 擷取第一行的date列

df.head(1)[‘date’][0] 擷取第一行的date列的元素值

sum(df[‘ability’]) 計算整個列的和

df[df[‘date’] == ‘20161111’] 擷取符合這個條件的行

df[df[‘date’] == ‘20161111’].index[0] 擷取符合這個條件的行的行索引的值

df.iloc[1] 擷取第二行

df.iloc[1][‘test2’] 擷取第二行的test2值

10 mins to pandas 

df.index 擷取行的索引

df.index[0] 擷取第一個行索引

df.index[-1] 擷取最後一個行索引,隻是擷取索引值

df.columns 擷取列标簽

df[0:2] 擷取第1到第2行,從0開始,不包含末端

df.loc[1] 擷取第二行

df.loc[:,’test1’] 擷取test1的那一列,這個冒号的意思是所有行,逗号表示行與列的區分

df.loc[:,[‘test1’,’test2’]] 擷取test1列和test2列的資料

df.loc[1,[‘test1’,’test2’]] 擷取第二行的test1和test2列的資料

df.at[1,’test1’] 表示取第二行,test1列的資料,和上面的方法類似

df.iloc[0] 擷取第一行

df.iloc[0:2,0:2] 擷取前兩行前兩列的資料

df.iloc[[1,2,4],[0,2]] 擷取第1,2,4行中的0,2列的資料

(df[2] &gt; 1).any() 對于Series應用any()方法來判斷是否有符合條件的

Python大資料處理子產品Pandas

一、            建立對象

可以通過 Data Structure Intro Setion 來檢視有關該節内容的詳細資訊。

1、可以通過傳遞一個list對象來建立一個Series,pandas會預設建立整型索引:

Python大資料處理子產品Pandas

2、通過傳遞一個numpy array,時間索引以及列标簽來建立一個DataFrame:

Python大資料處理子產品Pandas

3、通過傳遞一個能夠被轉換成類似序列結構的字典對象來建立一個DataFrame:

Python大資料處理子產品Pandas

4、檢視不同列的資料類型:

Python大資料處理子產品Pandas

5、如果你使用的是IPython,使用Tab自動補全功能會自動識别所有的屬性以及自定義的列,下圖中是所有能夠被自動識别的屬性的一個子集:

Python大資料處理子產品Pandas

二、            檢視資料

詳情請參閱:Basics Section

1、  檢視frame中頭部和尾部的行:

Python大資料處理子產品Pandas

2、  顯示索引、列和底層的numpy資料:

Python大資料處理子產品Pandas

3、  describe()函數對于資料的快速統計彙總:

Python大資料處理子產品Pandas

4、  對資料的轉置:

Python大資料處理子產品Pandas

5、  按軸進行排序

Python大資料處理子產品Pandas

6、  按值進行排序

Python大資料處理子產品Pandas

三、            選擇

雖然标準的Python/Numpy的選擇和設定表達式都能夠直接派上用場,但是作為工程使用的代碼,我們推薦使用經過優化的pandas資料通路方式: .at, .iat, .loc, .iloc 和 .ix詳情請參閱Indexing and Selecing Data 和 MultiIndex / Advanced Indexing。

l  擷取

1、 選擇一個單獨的列,這将會傳回一個Series,等同于df.A:

Python大資料處理子產品Pandas

2、 通過[]進行選擇,這将會對行進行切片

Python大資料處理子產品Pandas

l  通過标簽選擇

1、 使用标簽來擷取一個交叉的區域

Python大資料處理子產品Pandas

2、 通過标簽來在多個軸上進行選擇

Python大資料處理子產品Pandas

3、 标簽切片

Python大資料處理子產品Pandas

4、 對于傳回的對象進行次元縮減

Python大資料處理子產品Pandas

5、 擷取一個标量

Python大資料處理子產品Pandas

6、 快速通路一個标量(與上一個方法等價)

Python大資料處理子產品Pandas

l  通過位置選擇

1、 通過傳遞數值進行位置選擇(選擇的是行)

Python大資料處理子產品Pandas

2、 通過數值進行切片,與numpy/python中的情況類似

Python大資料處理子產品Pandas

3、 通過指定一個位置的清單,與numpy/python中的情況類似

Python大資料處理子產品Pandas

4、 對行進行切片

Python大資料處理子產品Pandas

5、 對列進行切片

Python大資料處理子產品Pandas

6、 擷取特定的值

Python大資料處理子產品Pandas

l  布爾索引

1、 使用一個單獨列的值來選擇資料:

Python大資料處理子產品Pandas

2、 使用where操作來選擇資料:

Python大資料處理子產品Pandas

3、 使用isin()方法來過濾:

Python大資料處理子產品Pandas

l  設定

1、 設定一個新的列:

Python大資料處理子產品Pandas

2、 通過标簽設定新的值:

Python大資料處理子產品Pandas

3、 通過位置設定新的值:

Python大資料處理子產品Pandas

4、 通過一個numpy數組設定一組新值:

Python大資料處理子產品Pandas

上述操作結果如下:

Python大資料處理子產品Pandas

5、 通過where操作來設定新的值:

Python大資料處理子產品Pandas

四、            缺失值處理

在pandas中,使用np.nan來代替缺失值,這些值将預設不會包含在計算中,詳情請參閱:Missing Data Section。

1、  reindex()方法可以對指定軸上的索引進行改變/增加/删除操作,這将傳回原始資料的一個拷貝:、

Python大資料處理子產品Pandas

2、  去掉包含缺失值的行:

Python大資料處理子產品Pandas

3、  對缺失值進行填充:

Python大資料處理子產品Pandas

4、  對資料進行布爾填充:

Python大資料處理子產品Pandas

五、            相關操作

詳情請參與 Basic Section On Binary Ops

統計(相關操作通常情況下不包括缺失值)

1、  執行描述性統計:

Python大資料處理子產品Pandas

2、  在其他軸上進行相同的操作:

Python大資料處理子產品Pandas

3、  對于擁有不同次元,需要對齊的對象進行操作。Pandas會自動的沿着指定的次元進行廣播:

Python大資料處理子產品Pandas

Apply

1、  對資料應用函數:

Python大資料處理子產品Pandas

直方圖

具體請參照:Histogramming and Discretization

Python大資料處理子產品Pandas

字元串方法

Series對象在其str屬性中配備了一組字元串處理方法,可以很容易的應用到數組中的每個元素,如下段代碼所示。更多詳情請參考:Vectorized String Methods.

Python大資料處理子產品Pandas

六、            合并

Pandas提供了大量的方法能夠輕松的對Series,DataFrame和Panel對象進行各種符合各種邏輯關系的合并操作。具體請參閱:Merging section

Concat

Python大資料處理子產品Pandas

Join 類似于SQL類型的合并,具體請參閱:Database style joining

Python大資料處理子產品Pandas

Append 将一行連接配接到一個DataFrame上,具體請參閱Appending:

Python大資料處理子產品Pandas

七、            分組

對于”group by”操作,我們通常是指以下一個或多個操作步驟:

(Splitting)按照一些規則将資料分為不同的組;

(Applying)對于每組資料分别執行一個函數;

(Combining)将結果組合到一個資料結構中;

詳情請參閱:Grouping section

Python大資料處理子產品Pandas

1、  分組并對每個分組執行sum函數:

Python大資料處理子產品Pandas

2、  通過多個列進行分組形成一個層次索引,然後執行函數:

Python大資料處理子產品Pandas

八、            Reshaping

詳情請參閱 Hierarchical Indexing 和 Reshaping。

Stack

Python大資料處理子產品Pandas
Python大資料處理子產品Pandas
Python大資料處理子產品Pandas

資料透視表,詳情請參閱:Pivot Tables.

Python大資料處理子產品Pandas

可以從這個資料中輕松的生成資料透視表:

Python大資料處理子產品Pandas

九、            時間序列

Pandas在對頻率轉換進行重新采樣時擁有簡單、強大且高效的功能(如将按秒采樣的資料轉換為按5分鐘為機關進行采樣的資料)。這種操作在金融領域非常常見。具體參考:Time Series section。

Python大資料處理子產品Pandas

1、  時區表示:

Python大資料處理子產品Pandas

2、  時區轉換:

Python大資料處理子產品Pandas

3、  時間跨度轉換:

Python大資料處理子產品Pandas

4、  時期和時間戳之間的轉換使得可以使用一些友善的算術函數。

Python大資料處理子產品Pandas

十、            Categorical

從0.15版本開始,pandas可以在DataFrame中支援Categorical類型的資料,詳細 介紹參看:categorical introduction和API documentation。

Python大資料處理子產品Pandas

1、  将原始的grade轉換為Categorical資料類型:

Python大資料處理子產品Pandas

2、  将Categorical類型資料重命名為更有意義的名稱:

Python大資料處理子產品Pandas

3、  對類别進行重新排序,增加缺失的類别:

Python大資料處理子產品Pandas

4、  排序是按照Categorical的順序進行的而不是按照字典順序進行:

Python大資料處理子產品Pandas

5、  對Categorical列進行排序時存在空的類别:

Python大資料處理子產品Pandas

十一、           畫圖

具體文檔參看:Plotting docs

Python大資料處理子產品Pandas

對于DataFrame來說,plot是一種将所有列及其标簽進行繪制的簡便方法:

Python大資料處理子產品Pandas
Python大資料處理子產品Pandas

十二、           導入和儲存資料

CSV,參考:Writing to a csv file

1、  寫入csv檔案:

Python大資料處理子產品Pandas

2、  從csv檔案中讀取:

Python大資料處理子產品Pandas

HDF5,參考:HDFStores

1、  寫入HDF5存儲:

Python大資料處理子產品Pandas

2、  從HDF5存儲中讀取:

Python大資料處理子產品Pandas

Excel,參考:MS Excel

1、  寫入excel檔案:

Python大資料處理子產品Pandas

2、  從excel檔案中讀取:

Python大資料處理子產品Pandas