顯示具有 Pandas 標籤的文章。 顯示所有文章
顯示具有 Pandas 標籤的文章。 顯示所有文章

2018年6月13日 星期三

jupyter lab module不能import的問題

Jupyter Lab是jupyter notebook的新版,但會常碰到一些module沒法成功import的問題。我就碰過幾次了,都會跑出這個結果:

ImportError: cannot import name 'is_list_like'
這邊把解法記下來:


沒法import pandas-datareader
參考stackoverflow


我的方法就是重裝囉:
> pip install git+https://github.com/pydata/pandas-datareader.git


沒法import ipywidgets
參考ipywidgets官網

install the JupyterLab Extension
> jupyter labextension install @jupyter-widgets/jupyterlab-manager

這應該能解決問題囉!!

2018年6月10日 星期日

Python:刪除重複值

最近試著寫個有關於字串的程式,其中必須要把重複值去掉,這才發現沒想像中那麼簡單。把結果紀錄如下。

當然最直觀的做法就是寫個for 迴圈,找出重複的部分再重組成一個新的list,當然這樣做是可以的,但比較麻煩,也容易出錯,最"簡單"(程式碼較少)的作法是利用python的資料結構set。
我們都知道python中的set會把重複的部分去除(這是我們要的):

這邊我們有個list(new_list),內有重複的'def',我們將new_list轉成set,再轉回list就可以把重複值去除了。

但很明顯的是,這樣做的缺點是次序會被打亂,因此解決的方式就是另用sorted函式並加個key:

達成目標了!!!

不過或許會有疑問,為什麼不使用sort函式?
這是因為sort是inline的排列,並不會回傳排序後的新list(回傳值是None):


所以如果排序只是程式中的一個步驟,沒有回傳值會很麻煩,小弟才疏學淺,接下來我實在不知怎寫下去。

當然python資料處理就不能忘了資料清洗之王Pandas,有了pandas,我們就可以利用.drop_duplicates函式處理。先import pandas,再把資料轉成pandas的series:

接下來進行去重複值的工作:

這邊要注意的是,.drop_duplicates函式會回傳一個新的series,並不會更改原來的series。
到這邊好像跟之前的方法大同小異,還要import pandas,好像也沒有更簡單,不過如果這麼想,這就太小看pandas了,.drop_duplicates函式預設的是保留(keep)第一個重複的值(keep='first'),刪除其他的重複值,但如果是你想保留最後一個呢?嘿嘿~~~這就非得用pandas了,將函式中的keep值設為'last':

如果心情不好,重複的值都去掉也可以,keep設為False就可:




2018年1月7日 星期日

Pandas (學習筆記III)

如何匯出或匯入資料?

假設我們在user的子目錄裡已有一個example.csv檔

.read_csv()           #打開csv檔
如以下的例子先建立路徑 filepath,再利用.read_csv指令打開example1檔案,並指定為store物件。

我們先前已指定檔案為store物件,可以試試看是否為正確的檔案。以下以.iloc[ ] method取出store的片段資料。(可參考之前的文章Pandas(學習筆記I))

從上面的結果發現有所錯誤,第一行(row)的資料被當成表格的標題了。因此我們在.read_csv的argument中再加入 header = None (注意None第一個字母要大寫),表示資料中不包含表格的標題。
雖然這樣看來是對了,但好像還缺了甚麼,最好還是把表格的標題寫出來,這邊在.read_csv的argument中加入 names = column (必須先定義column的內容)。這樣表格資料就完整多了。

最後可以利用.to_excel的method把store輸出為Excel的xlsx的檔案,但記得先指定路徑檔名為store.xlsx: store.xlsx = 'store.xlsx' 。執行後看不到任何回應,但回到剛才的目錄下可以發現多了一個store.xlsx的檔案,可以打開來看看是否正確。這樣就完成資料的修正啦!

假設檔案不是.csv而我們要直接讀Excel的檔案,則使用pd.read_excel()指令:



參考資料

datacamp



Pandas (學習筆記I)

Why Pandas?

Pandas是python中常用的套件之一,如同 numpy 能延伸 python 的 list,pandas 能延伸 python 的 dictionary 。

A little bit Review

  • python中的list是以[]將元素包起來。
  • tuple中的元素則不能變更,以tuple()的方式建立物件,或將list轉換成tuple。
  • set則是無序的集合,可以set()將list轉成set,要注意的是set中元素不重覆。
  • dictionary則是帶有鍵值(key)的list,以{}建立dictionary物件,或利用dict()函數轉換list成為dictionary。

pandas DataFrames

Method 1:
.iloc[,]            #可協助我們擷取資料的一部分

例如我們有下列的資料,已預設於df

.iloc[:3,:]      #擷取資料的前三row


.iloc[-3:,:]       #擷取資料的後三row

補充: iloc vs loc
上述index的數字跟一般python的"位移"概念是類似的。但是.loc (少個i)是明確的索引:

.iloc 背雖然好用,但背後的索引概念卻限制了遮罩(mask)的使用。如下列例子是mask的應用,必須使用明確index的.loc:



Method 2:
.head()           #可協助我們擷取起始資料的部分

.head(3)         #擷取資料的前三row

Method 3:

.tail()               #可協助我們擷取資料尾端的部分

.tail()               # 若不給argument,預設是顯示後five rows

.tail(3)    # 擷取資料尾端的部分
Attribute 1:
.info       # 顯示資料相關資訊,包含index種類、column的標籤等等
                            (因為本例較簡單,所以幾乎是整個表了)

Attribute 2:
.values           # 以numpy array的方式顯示表格資料

其他:

NaN  (Not-a-Number)可以用來表示資料中不見的data

參考資料

R 語言使用者的 Python 學習筆記系列

Pandas: Broadcasting (學習筆記II)

Broadcasting


"broadcasting" 是Python numpy中的特色之一,可用於Pandas之中快速產生DataFrame。

以下的例子來說:
我們想知道店裡有多少店員(Employee)及多少客人(customer),我們可以如下述第一個程式先建立三個list(Work_Day, num_cust, Empolyee),之後利用pd.DataFrame的method產生表格(注意Pandas神奇之處在於表格最左邊已預設每一row的編號了)。

不過我們建立表格時,發現店員人數並沒變化,因此根本不需要建立list,在建立dictionary時,直接輸入數字,就可以完成表格製作了(如第二個程式紅色框圈起來之處)。這就是所謂broadcasting的功能,可以幫助我們快速地建立資料。



 當然這個例子只有五個數據,程式差異並不大,但當數據很多時,會相當有用。



參考資料
datacamp
https://www.datacamp.com/courses/pandas-foundations