哈哈哈 -- 哈?10分鐘入門pandas!

感恩節來了... 欠了大家兩個月的pandas教程該還上了...

當作大哥送給400+專欄小粉絲的感恩節學習大禮包...

10分鐘就能入門pandas? 你信嗎,哈哈哈,反正打死我是不信的...

但標題黨的pandas官方文檔就是這麼寫的 --

10 Minutes to pandas

兩個月前讀這篇官方文檔的時候,我對pandas的了解僅限皮毛,比如讀取文件,了解數據結構,選取需要的數據等,都是一些最最小白的姿勢。我當時在電腦前坐了整整1小時16分鐘才看完,大概消化了90%的內容。

即使它狠狠地欺騙了我,但我還是義無反顧地為它瘋狂打call... 它是一份系統並且相對簡潔的pandas入門教程,幫助初學者在最快的時間內了解pandas和numpy的功能。這份文檔以後還可以作為小抄使用,因為它介紹基本是pandas中最重要、使用頻率最高的一些功能。


如果你是一個對python都一無所知的小小白,你可能需要的準備工作是:

1.深fu吸,真的很長...

2.下載安裝Anacondacontinuum.io/downloads

Anaconda是什麼呢???是一種蟒蛇(認真臉)...

然鵝,在數據分析領域,Anaconda是「一個用於科學計算的Python發行版,提供了包管理與環境管理的功能,可以很方便地解決多版本python並存、切換以及各種第三方包安裝問題,並且已經包含了Python和相關的配套工具」。

總之,它很牛逼,它還免費,搞數據的基本人人都在用!Anaconda裡面預裝了很多常用python庫,包括數據分析屆常用的pandas,numpy,matplotlib等等等... 還有還有,它還帶了數據分析神器 -- Jupyter Notebook!你的數據分析戀戀筆記本~

更多Anaconda使用方法,請參考→致Python初學者們 - Anaconda入門使用指南

3. 了解一些Jupyter Notebook的快捷鍵操作,會幫你打代碼打到飛起~

→_→ Jupyter Notebook 的快捷鍵

4. 對python、pandas和numpy有一丟丟的小了解,最起碼知道series, array, data frame等基本概念。

知乎數據大神秦路寫了一系列比較簡潔的python入門,值得看看:

  • 開始Python的新手教程
  • 開始Python的數據結構
  • 了解和掌握Python的函數
  • numpy和pandas入門

5. 學習過程中不要偷懶,遇到困難,首先要學會嘗試先自己解決,比如通過閱讀pandas官方文檔。官方文檔永遠是最重要的學習材料!

6. 打開你的Jupyter Notebook,一起來敲代碼吧~~~

*如果你裝了Anaconda,Jupyter Notebook在Mac中的打開方式是在Launchpad中搜索「Terminal(終端)」,在終端中直接輸入"jupyter notebook",就在你的瀏覽器中打開啦~

進入你的目標文件夾, 點擊「New」,最好選擇Python 3創建你的notebook。

內心o.s.: 這準備工作寫完,我已經快累死了...


英文原文非常簡潔友好,理解簡單,而且我怕翻譯不好被噴,所以還是用的英文原文(真的不是因為我懶)~ 在小白們可能會卡機的地方,我也加了注釋,希望可以幫大家更效率地啃完這篇「10分鐘」標題黨~

所以,答應大哥,不要放棄治療,好嗎??!!

0)Import Libraries

Customarily, we import as follows:

木有導入pandas,numpy,matplot畫圖庫,接下來怎麼玩,科科~ 這些庫在anaconda中都有,所以直接import使用就好啦~

1)Object Creation

Creating a Series by passing a list of values, letting pandas create a default integer index:

pandas使用NaN(not a number)來表示缺失值,使用numpy的nan來生成,這些值默認不會包含在計算中~

Creating a DataFrame by passing a numpy array, with a datetime index and labeled columns:

Creating a DataFrame by passing a dict of objects that can be converted to series-like.

Having specific dtypes

float 32和float64的區別:數位的區別,一個在內存中佔分別32和64個bits,也就是4bytes或8bytes,數位越高浮點數的精度越高(百度知道_行雲啊)

2)Viewing Data

See the top & bottom rows of the frame

Display the index, columns, and the underlying numpy data

Describe shows a quick statistic summary of your data

Transposing your data (行和列交換)

Sorting by an axis

sort_index()默認是axis=0,ascending=True,對行進行排序,升序排列。

如果要對列進行排序,並設成降序,就是df.sort_index(axis=1, ascending=False)~

Sorting by values

3) Selection

pandas中訪問數據的主要方式有:.at, .iat, .loc, .iloc, .ix

原文沒有提供.ix的例子,簡單介紹一下~ loc是根據標籤索引,iloc是根據位置索引,ix就是兩者的結合體~

BUT!!! 這個loc和iloc的混血寶寶.ix快被淘汰了... 雖然目前暫時還可以使用,但會有警告提示... 記住這個Deprecation Warning,以後大家還可能常碰到...

// Getting

Selecting a single column, which yields a Series, equivalent to df.A

Selecting via [ ], which slices the rows.

// Selection by Label

For getting a cross section using a label

Selecting on a multi-axis by label

Showing label slicing, both endpoints are included

Reduction in the dimensions of the returned object

For getting a scalar value

Scalar(標量)是只有大小,沒有方向的量,所以可以用實數表示的一個量。 標量可以是負數,例如溫度低於冰點。 與之相對,Vector(向量,又稱矢量)既有大小,又有方向。

For getting fast access to a scalar (equiv to the prior method)

// Selection by Position

Select via the position of the passed integers

By integer slices, acting similar to numpy/python

By lists of integer position locations, similar to the numpy/python style

For slicing rows explicitly

For slicing columns explicitly

For getting a value explicitly

For getting fast access to a scalar (equivalent to the prior method)

// Boolean Indexing

Using a single column』s values to select data.

Selecting values from a DataFrame where a boolean condition is met.

Using the isin( ) method for filtering:

isin( ) 的詳細玩法在此:pandas.DataFrame.isin

// Setting

Setting a new column automatically aligns the data by the indexes

"Setting by assigning with a numpy array」那一步的操作就是:根據df的長度(df的行數),把「D」列的值全部設為5。

對numpy中array(數組)的理解還不夠深刻的,一定要戳官方文檔→numpy.array

A where operation with setting.

4) Missing Data

缺失值處理官方文檔→_→ Working with missing data

pandas主要用np.nan代表缺失值,而且默認是不會把缺失值帶入計算。

Reindexing allows you to change/add/delete the index on a specified axis. This returns a copy of the data.

To drop any rows that have missing data.

Filling missing data

To get the boolean mask where values are nan

5) Operations

// Stats

Operations in general exclude missing data.

Performing a descriptive statistic

默認是按列計算平均值

Same operation on the other axis

按行計算平均值

Operating with objects that have different dimensionality and need alignment. In addition, pandas automatically broadcasts along the specified dimension.

欲了解shift( ),先來看看s = pd.Series([1,3,5,np.nan,6,8], index=dates)的輸出結果:

2013-01-01 1.0n2013-01-02 3.0n2013-01-03 5.0n2013-01-04 NaNn2013-01-05 6.0n2013-01-06 8.0nFreq: D, dtype: float64 n

關於shift的官方解釋在此→_→ pandas.DataFrame.shift,蠢萌如我,讀了好幾遍,也沒太明白...... 只好通過在shift( )括弧中不停試數字的方法試出了點道道...... 所以它的意思呢,就是往上或下移動數據,數字代表移動的行數。shift(2)代表往下移動兩行,所以日期1-1和1-2對應的數字變成了缺失值,1-5和1-6對應的6.0和8.0被擠沒了......

再來看看shift(-2)的結果,就是往上移動兩行,所以是1.0和3.0沒了......

2013-01-01 5.0n2013-01-02 NaNn2013-01-03 6.0n2013-01-04 8.0n2013-01-05 NaNn2013-01-06 NaNnFreq: D, dtype: float64 n

sub( )官方文檔→_→ pandas.DataFrame.sub,sub就是subtraction(減去)的意思。

這是df原來的模樣:

這是使用了sub( )之後的樣子:

火眼睛睛的寶寶們,看出來變化了嗎?sub( )把列數據依次減掉了NaN,NaN,1,3,5,NaN(之前設的s的值),所有跟NaN計算的數據也都變成了缺失值。比如看「A」列,0-NaN=NaN,1.33-NaN=NaN,-0.76-1=-1.76,0.42-3=-2.58,以此類推。

// Apply

Applying functions to the data

np.cumsum(累積求和): return the cumulative sum of the elements along a given axis

默認是sum over rows (axis=0),axis=1是sum over columns

在這裡,lambda x: x.max( ) - x.min( ) 就是用每一列中最大的數減去最小的數。

lambda就是一個沒有具體名字的函數,因此也叫匿名函數(突然有種不明覺厲的趕腳)... lambda是為了簡化語句而誕生的,然鵝,卻常被世人嫌棄...

具體的lambda品味方法請移步 Python天天美味(35) - 細品lambda

// Histogramming (木有圖的直方圖)

np.random.randint (0,7) 是在0和7之間(包括0,但不包括7)隨機產生整數,也可以寫為np.random.randint (7) ,默認從0(包括0)開始,到7(但不包括7)中間產生隨機整數。

統計每個數出現的次數

// String Methods

Series is equipped with a set of string processing methods in the str attribute that make it easy to operate on each element of the array, as in the code snippet below.

把大寫變成小寫...

6) Merge

// Concat

Concatenating pandas objects together with concat():

// Join

SQL style merges.

Another example

如果還不知道SQL(結構化查詢語言)的寶寶們,那最好自行去補補哦~ 畢竟熟練基礎SQL查詢語句是數據分析獅的必備技能~

// Append

Append rows to a dataframe

從df中選取第3行的數據,儲存到s中,再把s貼到df的下面,並忽略index,只貼數值。

7) Grouping

By 「group by」 we are referring to a process involving one or more of the following steps

  • Splitting the data into groups based on some criteria
  • Applying a function to each group independently
  • Combining the results into a data structure

Grouping and then applying a function sum to the resulting groups.

在使用group by的時候,一般還會夾帶使用其他函數。在這個例子里,就是根據A列的」bar「和「foo」分組,分別計算對應的C列和D列數值的總和。

Grouping by multiple columns forms a hierarchical index, which we then apply the function

根據A列和B列分組(產生了多層索引),計算對應的C和D列的數值總和

8) Reshaping

// Stack

如果此時的你看到「tuples」一臉懵逼,就代表你沒有提前看完大哥的reading assignment,哼哼~ 懵圈的你趕緊去瞅一眼秦路大神的教程吧,開始Python的數據結構~

上面還出現了zip函數,它的作用是將兩個list打包成了一個個tuple。再來看一個list(zip( ))的例子,了解其中奧妙:

The stack() method 「compresses」 a level in the DataFrame』s columns.

stack( ) 將列索引變成了行索引

With a 「stacked」 DataFrame or Series (having a MultiIndex as the index), the inverse operation of stack()is unstack(), which by default unstacks the last level:

stack( )相反的操作是unstack( ),這兩朵塑料姐妹花,加上python從0開始計數,很容易讓人紅紅火火恍恍惚惚...... 大概可以理解為stack是列變行索引,unstack是行變列索引。unstack默認是將最後一層的行索引變成列索引,寫為unstack( ),或者unstack(-1)。在stacked中,最後一層的行索引是A和B。

unstack(0)是將第一層行索引變列索引,也就是bar和baz;unstack(1)是將

stacked中的第二層行索引one&two變為列索引。

解釋到這裡,大哥已經耗盡了洪荒之力... 如果還不懂的,還是去看官方文檔,並且在紙上寫一寫,摸索出規律...

stack → pandas.DataFrame.stack

unstack → pandas.DataFrame.unstack

// Pivot Tables

熟悉Excel的寶寶們應該了解pivot table(透視表)這個常用的東東,使用pandas也可以輕鬆創建pivot table~

9)Time Series

pandas has simple, powerful, and efficient functionality for performing resampling operations during frequency conversion (e.g., converting secondly data into 5-minutely data). This is extremely common in, but not limited to, financial applications.

上面的output是rng的前面一小部分截圖,我們可以從output看出來,我們是以2012年1月1日為基準,以秒(S)為單位增長,創建了100個時間序列。

創建一個pandas Series,將rng作為索引,並根據rng長度賦值,取值是從0到500中選取的隨機整數。output是ts前5行。

重新採樣,以5分鐘為單位,統計5分鐘單位中對應的數值總和,類似於前面介紹過的Histogramming(直方圖)。因為我們這100個時間序列中最後的時間僅為1分39秒,所以這裡以」5分鐘「為單位採樣統計總和,相當於統計了所有100個時間序列值的總和。

如果以」1分鐘「為單位,就可以看出門道了~ 00:00:00到00:01:00的對應值總和為16904,00:01:00之後的總和為10263。

Time zone representation

D代表day

tz_localize的官方解釋是」Localize tz-naive TimeSeries to target time zone「,具體可參考官方文檔→ pandas.Series.tz_localize

pandas中時區的處理一時半會兒不是很好理解... 總之嘞,pandas默認生成的序列是單純的時區(timezone-naive),從單純到本地化的轉化就需要藉助tz_localize,上面的例子中是轉化成了UTC (協調世界時),大家之前可能聽過格林尼治時間,UTC就是目前接替格林尼治時間的存在,是當前的國際標準...

一旦時間序列轉換成了某個特定時區,就可以通過tz_convert轉換到其他時區了,上面例子是轉換到美國東部時區。

關於python時間序列,大家可以參考一下這篇博客 → 《利用python進行數據分析》讀書筆記--第十章 時間序列(一)

Converting between time span representations

to_period( )的官方文檔解釋有一丟丟」只可意會不可言傳「的霸氣范 -- 」Convert DataFrame from DatetimeIndex to PeriodIndex with desired frequency (inferred from index if not passed)「。

大意是可以根據指定頻率改變時間索引(比如D, M),頻率如果沒有指定,將由時間戳索引中推斷出來... 所以在上面例子中,它自己推斷出來的新頻率是」月「。而且以」月「為頻率,索引沒有重複值:2012-01,2012-02... 非常合理~

to_timestamp( ) 比較好理解,就是重新轉換為時間戳...

Converting between period and timestamp enables some convenient arithmetic functions to be used. In the following example, we convert a quarterly frequency with year ending in November to 9am of the end of the month following the quarter end:

這道就作為時間序列的課後思考題了,大哥就不詳解了,科科~ 如果暫時不需要用python處理時間序列,可以skip,需要用到的時候再回頭看~

如果你現在已經是下圖的狀態...

恭喜你,你的癥狀跟我一毛一樣!!!

「10分鐘」真的真的馬上到底了,而且後面很簡單,千萬不要棄療啊!!!

送你一群滾滾治癒一下...

10) Categoricals

pandas can include categorical data in a DataFrame.

Convert the raw grades to a categorical data type.

Rename the categories to more meaningful names (assigning to Series.cat.categories is inplace!)

使用.cat.categories為類別重新命名,而且是在原數據上操作。

Reorder the categories and simultaneously add the missing categories (methods under Series .cat return a new Series per default).

為類別排序並同時加入了原數據中沒有的類別 -- 」bad「和 "medium"。

Sorting is per order in the categories, not lexical order.

排序是根據你剛才定義的類別順序,而不是lexical(詞法)排序

Grouping by a categorical column shows also empty categories.

還記得Grouping裡面介紹過的groupby這個重要功能嗎~ 在這裡使用groupby,還能顯示剛才加入的bad和medium類別,對應的出現頻率為0。

11) Plotting

使用matplotlib庫畫圖實在博大精深... 然鵝,在這篇官方文檔里,作者只粗略地不能再粗略地提筆而過... 估計作者寫這」10分鐘「也寫崩了...

大家記得去看官方文檔 →_→ Visualization

還有,最後我會種草一門udemy的課~

首先要import畫圖庫,而且,為了在jupyter notebook顯示圖像,需要再加一行代碼」%matplotlib inline「。

第一幅圖是隨機數組成的時間序列,第二幅用了.cumsum( )這個累積求和函數。.cumsum在上面Operations下面的Apply里有簡單介紹。

On DataFrame, plot() is a convenience to plot all of the columns with labels:

在一副圖裡同時展示4列數據

12) Getting Data In/Out

pandas可以讀取很多類型的文件,需要用到的時候去網上搜代碼即可。你急需的官方文檔在此→ IO Tools (Text, CSV, HDF5, ...)~

常用的文件包括CSV,JSON,HTML,SQL等,甚至還可以讀取你的本地剪切板~

這裡我只介紹最常用的讀取和生成csv文件。

如果讀取的文件存放在你的工作目錄,直接在括弧里打文件名即可(如下例),否則要打出完整的文件路徑。

哦不,還沒完......

敬業的大哥還要掙扎著爬起來,給大家種草...

憑藉我的敬業精神,我覺得我值得擁有Coursera和Udemy的終生免費聽課+考證VIP...

  1. Udemy>> Learning Python for Data Analysis and Visualization

我在數據分析,從入門到摔門這篇文章里也牆裂打call過,這門課是udemy上專門講pandas的爆款課程,非常詳細,非常系統,還有三個case講解,帶你深入體驗pandas黑科技~~~

我目前已經上完了pandas基礎、畫圖和三個case,我覺得這門課也被我壓榨得差不多了~ 三個案例簡直不能更贊~

Udemy上的課常年打折... 這門課的價格基本在10-50間浮動,大部分時候價格是10-15刀。所以大家可以在10刀的時候拿下。

這門課屬於非常基礎的數據分析入門課了,接下來兩門是我最近上過或者在上的,推薦給需要進階的大寶寶們。

2. Udemy>> Machine Learning A-Z

這門也是Udemy上機器學習的爆款課程,41小時的視頻,又講Python又講R...... 不過真的二選一就好了,兩者在一起上一沒必要,二很容易搞混。

我最近因為做project,就挑了Clustering部分的視頻看,竟然發現...... 老師講得超乎其常得友好簡單...... 畢竟側重點是應用,概念不會講很深。

3. Udemy>> Introduction to Time Series Analysis and Forecasting in R

為了寫預測的作業,花了大半天研究這門課。個人覺得還是挺不錯的,我課上學過的各種預測模型(ARIMA, Holt-Winters等)這門課里都講了,對初級數據分析師來說夠用了。老師講得簡單明了,不說廢話,code也教得不錯。想學習預測的寶寶們可以上一下。

雖然我更常用python,但R在統計方面更好用,所以在學時間序列的時候,還是選擇了R作為第一語言。


最後的最後,祝大家感恩節快樂~

反正大哥今年的買包經費要砸在教育投資 -- 換電腦上了...


推薦閱讀:

TAG:Python | 数据分析 | 数据分析师 |