Python數據分析及可視化實例之Pandas十分鐘入門

直接上源碼,內含Bokeh初嘗鮮:

# coding: utf-8# # 十分鐘上手 Pandas 2016-07-05整理# `pandas` 是一個 `Python Data Analysis Library`。# # 安裝請參考官網的教程,如果安裝了 `Anaconda`,則不需要安裝 `pandas` 庫。# In[1]:get_ipython().magic("matplotlib inline")import pandas as pdimport numpy as npimport matplotlib.pyplot as plt# ## 產生 Pandas 對象# `pandas` 中有三種基本結構:# # - `Series`# - 1D labeled homogeneously-typed array# - `DataFrame`# - General 2D labeled, size-mutable tabular structure with potentially heterogeneously-typed columns# - `Panel`# - General 3D labeled, also size-mutable array# ### Series# 一維 `Series` 可以用一維列表初始化:# In[2]:s = pd.Series([1,3,5,np.nan,6,8]);s# 默認情況下,`Series` 的下標都是數字(可以使用額外參數指定),類型是統一的。# # ### DataFrame# # `DataFrame` 則是個二維結構,這裡首先構造一組時間序列,作為我們第一維的下標:# In[3]:dates = pd.date_range("20170101", periods=6)dates# 然後創建一個 `DataFrame` 結構:# In[4]:df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list("ABCD"))df# 默認情況下,如果不指定 `index` 參數和 `columns`,那麼他們的值將用從 `0` 開始的數字替代。# # 除了向 `DataFrame` 中傳入二維數組,我們也可以使用字典傳入數據:# In[5]:df2 = pd.DataFrame({"A" : 1., "B" : pd.Timestamp("20130102"), "C" : pd.Series(1,index=list(range(4)),dtype="float32"), "D" : np.array([3] * 4,dtype="int32"), "E" : pd.Categorical(["test","train","test","train"]), "F" : "foo" })df2# 字典的每個 `key` 代表一列,其 `value` 可以是各種能夠轉化為 `Series` 的對象。# # 與 `Series` 要求所有的類型都一致不同,`DataFrame` 值要求每一列數據的格式相同:# In[6]:df2.dtypes# ## 查看數據# ### 頭尾數據# `head` 和 `tail` 方法可以分別查看最前面幾行和最後面幾行的數據(默認為 5):# In[7]:df.head()# 最後 3 行:# In[8]:df.tail(3)# ### 下標,列標,數據# 下標使用 `index` 屬性查看:# In[9]:df.index# 列標使用 `columns` 屬性查看:# In[10]:df.columns# 數據值使用 `values` 查看:# In[11]:df.values# ### 統計數據# 查看簡單的統計數據:# In[12]:df.describe()# ### 轉置# In[13]:df.T# ## 排序# `sort_index(axis=0, ascending=True)` 方法按照下標大小進行排序,`axis=0` 表示按第 0 維進行排序。# In[14]:df.sort_index(ascending=False) # 對index進行排序# In[15]:df.sort_index(axis=1, ascending=False) # 對columns進行排序# `sort_values(by, axis=0, ascending=True)` 方法按照 `by` 的值的大小進行排序,例如按照 `B` 列的大小:# In[16]:df.sort_values(by="B")# ## 索引# 雖然 `DataFrame` 支持 `Python/Numpy` 的索引語法,但是推薦使用 `.at, .iat, .loc, .iloc 和 .ix` 方法進行索引。# ### 讀取數據# 選擇單列數據:# In[17]:df["A"]# 也可以用 `df.A`:# In[18]:df.A# 使用切片讀取多行:# In[19]:df[0:3]# `index` 名字也可以進行切片:# In[20]:df["20130101":"20130103"]# ### 使用 `label` 索引# `loc` 可以方便的使用 `label` 進行索引:# In[21]:df.loc[dates[0]]# 多列數據:# In[22]:df.loc[:,["A","B"]]# 選擇多行多列:# In[23]:df.loc["20130102":"20130104",["A","B"]]# 數據降維:# In[24]:df.loc["20130102",["A","B"]]# 得到標量值:# In[25]:df.loc[dates[0],"B"]# 不過得到標量值可以用 `at`,速度更快:# In[26]:get_ipython().magic("timeit -n100 df.loc[dates[0],"B"]")get_ipython().magic("timeit -n100 df.at[dates[0],"B"]")df.at[dates[0],"B"]# ### 使用位置索引# `iloc` 使用位置進行索引:# In[27]:df.iloc[3] # 第3行數據# 連續切片:# In[28]:df.iloc[3:5,0:2]# 索引不連續的部分:# In[29]:df.iloc[[1,2,4],[0,2]]# 索引整行:# In[30]:df.iloc[1:3,:]# 整列:# In[31]:df.iloc[:, 1:3]# 標量值:# In[32]:df.iloc[1,1]# 當然,使用 `iat` 索引標量值更快:# In[33]:get_ipython().magic("timeit -n100 df.iloc[1,1]")get_ipython().magic("timeit -n100 df.iat[1,1]")df.iat[1,1]# ### 布爾型索引# 所有 `A` 列大於 0 的行:# In[34]:df[df.A > 0]# 只留下所有大於 0 的數值:# In[35]:df[df > 0]# 使用 `isin` 方法做 `filter` 過濾:# In[36]:df2 = df.copy()df2["E"] = ["one", "one","two","three","four","three"]df2# In[37]:df2[df2["E"].isin(["two","four"])]# ### 設定數據的值# In[38]:s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range("20130102", periods=6))s1# 像字典一樣,直接指定 `F` 列的值為 `s1`,此時以 `df` 已有的 `index` 為標準將二者進行合併,`s1` 中沒有的 `index` 項設為 `NaN`,多餘的項捨去:# In[39]:df["F"] = s1df# 或者使用 `at` 或 `iat` 修改單個值:# In[40]:df.at[dates[0],"A"] = 0df# In[41]:df.iat[0, 1] = 0df# 設定一整列:# In[42]:df.loc[:,"D"] = np.array([5] * len(df))df# 設定滿足條件的數值:# In[43]:df2 = df.copy()df2[df2 > 0] = -df2df2# ## 缺失數據# In[44]:df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ["E"])df1.loc[dates[0]:dates[1],"E"] = 1df1# 丟棄所有缺失數據的行得到的新數據:# In[45]:df1.dropna(how="any")# 填充缺失數據:# In[46]:df1.fillna(value=5)# 檢查缺失數據的位置:# In[47]:pd.isnull(df1)# ## 計算操作# ### 統計信息# 每一列的均值:# In[48]:df.mean()# 每一行的均值:# In[49]:df.mean(1)# 多個對象之間的操作,如果維度不對,`pandas` 會自動調用 `broadcasting` 機制:# In[50]:s = pd.Series([1,3,5,np.nan,6,8], index=dates).shift(2)s# 相減 `df - s`:# In[51]:df.sub(s, axis="index")# ### apply 操作# 與 `R` 中的 `apply` 操作類似,接收一個函數,默認是對將函數作用到每一列上:# In[52]:df.apply(np.cumsum)# 求每列最大最小值之差:# In[53]:df.apply(lambda x: x.max() - x.min())# ### 直方圖# In[54]:s = pd.Series(np.random.randint(0, 7, size=10))s# 直方圖信息:# In[55]:s.value_counts()# 繪製直方圖信息:# In[56]:h = s.hist()# ### 字元串方法# 當 `Series` 或者 `DataFrame` 的某一列是字元串時,我們可以用 `.str` 對這個字元串數組進行字元串的基本操作: # In[57]:s = pd.Series(["A", "B", "C", "Aaba", "Baca", np.nan, "CABA", "dog", "cat"])s.str.lower()# ## 合併# ### 連接# In[58]:df = pd.DataFrame(np.random.randn(10, 4))df# 可以使用 `pd.concat` 函數將多個 `pandas` 對象進行連接:# In[59]:pieces = [df[:2], df[4:5], df[7:]]pieces# In[60]:pd.concat(pieces) # pieces是一個很奇怪的list# ### 資料庫中的 Join# `merge` 可以實現資料庫中的 `join` 操作:# In[61]:left = pd.DataFrame({"key": ["foo", "foo"], "lval": [1, 2]});left# In[62]:right = pd.DataFrame({"key": ["foo", "foo"], "rval": [4, 5]});right# In[63]:pd.merge(left, right, on="key")# ### append# 向 `DataFrame` 中添加行:# In[64]:df = pd.DataFrame(np.random.randn(8, 4), columns=["A","B","C","D"])df# 將第三行的值添加到最後:# In[65]:s = df.iloc[3]df.append(s, ignore_index=True)# ### Grouping# In[66]:df = pd.DataFrame({"A" : ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"], "B" : ["one", "one", "two", "three", "two", "two", "one", "three"], "C" : np.random.randn(8), "D" : np.random.randn(8)})df# 按照 `A` 的值進行分類:# In[67]:df.groupby("A").sum()# 按照 `A, B` 的值進行分類:# In[68]:df.groupby(["A", "B"]).sum()# ## 改變形狀# ### Stack# 產生一個多 `index` 的 `DataFrame`:# In[69]:tuples = list(zip(*[["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"], ["one", "two", "one", "two", "one", "two", "one", "two"]]))index = pd.MultiIndex.from_tuples(tuples, names=["first", "second"])df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=["A", "B"])df# `stack` 方法將 `columns` 變成一個新的 `index` 部分:# In[70]:df2 = df[:4]stacked = df2.stack()stacked# 可以使用 `unstack()` 將最後一級 `index` 放回 `column`:# In[71]:stacked.unstack()# 也可以指定其他的級別:# In[72]:stacked.unstack(1)# ## 時間序列# 金融分析中常用到時間序列數據:# In[94]:rng = pd.date_range("3/6/2017 00:00", periods=5, freq="D")ts = pd.Series(np.random.randn(len(rng)), rng)ts# 標準時間表示:# In[95]:ts_utc = ts.tz_localize("UTC")ts_utc# 改變時區表示:# In[96]:ts_utc.tz_convert("US/Eastern")# ## Categoricals# In[97]:df = pd.DataFrame({"id":[1,2,3,4,5,6], "raw_grade":["a", "b", "b", "a", "a", "e"]})df# 可以將 `grade` 變成類別:# In[98]:df["grade"] = df["raw_grade"].astype("category")df["grade"]# 將類別的表示轉化為有意義的字元:# In[99]:df["grade"].cat.categories = ["very good", "good", "very bad"]df["grade"]# 添加缺失的類別:# In[100]:df["grade"] = df["grade"].cat.set_categories(["very bad", "bad", "medium", "good", "very good"])df["grade"]# 使用 `grade` 分組:# In[101]:df.groupby("grade").size()# ## 繪圖# 使用 `ggplot` 風格:# In[102]:plt.style.use("ggplot")# `Series` 繪圖:# In[103]:ts = pd.Series(np.random.randn(1000), index=pd.date_range("1/1/2000", periods=1000))p = ts.cumsum().plot()# In[104]:import pandas as pdfrom bokeh.charts import TimeSeriesfrom bokeh.io import output_notebook, showoutput_notebook()# In[105]:ts_pl = TimeSeries(ts.cumsum(),title="timeseries, bokeh", legend="top_right",xlabel="Date", ylabel="Prices")show(ts_pl) # 可以很方便的指定圖例、xy周的標籤,圖面也漂亮了很多# `DataFrame` 按照 `columns` 繪圖:# In[106]:df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=["A", "B", "C", "D"])df.cumsum().plot()p = plt.legend(loc="best")# In[107]:ts_pl = TimeSeries(df.cumsum(),title="timeseries, bokeh", legend="top_left",xlabel="Date", ylabel="Prices")show(ts_pl) # 可以很方便的指定圖例、xy周的標籤,圖面也漂亮了很多# ## 文件讀寫# ### csv# 寫入文件:# In[87]:df.to_csv("foo.csv")# 從文件中讀取:# In[88]:pd.read_csv("foo.csv").head()# ### hdf5# 寫入文件:# In[89]:df.to_hdf("foo.h5", "df")# 讀取文件:# In[90]:pd.read_hdf("foo.h5","df").head()# ### excel# 寫入文件:# In[91]:df.to_excel("foo.xlsx", sheet_name="Sheet1")# 讀取文件:# In[92]:pd.read_excel("foo.xlsx", "Sheet1", index_col=None, na_values=["NA"]).head()# 清理生成的臨時文件:# In[93]:import globimport osfor f in glob.glob("foo*"): os.remove(f)# ## 更多參考資料:# ### http://pandas.pydata.org/pandas-docs/stable/dsintro.html

膠水語言博大精深,

本主只得一二為新人帶路:

Python數據分析及可視化實例目錄


最後,別只收藏不關注哈

推薦閱讀:

如何評價最新發布的ECharts 4?
亮瞎雙眼的Power BI自定義可視化圖表
(轉)22個免費的數據可視化和分析工具推薦
數據人也要懂的「裝逼利器」,數據驅動下的「增長黑客」

TAG:Python | 数据分析 | 数据可视化 |