Pandas 基礎 (4) - 讀 / 寫 Excel 和 CSV 檔案

Rachel發表於2019-03-08

- 讀入 CSV 檔案

首先是準備一個 csv 檔案, 這裡我用的是 stock_data.csv, 我貌似沒有找到上傳檔案的地方, 所以就把表格截圖下來, 大家可以因為資料量不大, 大家照著格式敲一下用吧:
file
正如前面講過的, csv 檔案可以放在 jupyter notebook 同目錄下, 這樣直接寫檔名就可以了, 但是如果沒有放在同目錄下, 就需要寫絕對路徑, 否則讀取不到.

import pandas as pd
df = pd.read_csv('/Users/rachel/Sites/pandas/py/pandas/4_read_write_to_excel/stock_data.csv')
df

輸入輸出的效果, 截圖如下:\
file
上面就是引入 csv 檔案最基本最常規的情況, 下面介紹一些特殊情況:

- 當原 csv 檔案有個檔案頭(如下圖):

file
大家可以自行修改一下 csv 檔案, 然後在 jupyter 裡執行一下看看得到什麼結果, 這裡就不截圖了, 總之, 顯然我們並不想要那多出來的一行, 可以這樣做:

df = pd.read_csv('/Users/rachel/Sites/pandas/py/pandas/4_read_write_to_excel/stock_data.csv', header = 1)

這裡設定了第二個引數 header=1, 意思就是我們要引入的從第一行開始以下的內容(把檔案看作是從第0行開始的)\
另外, 還可以這麼寫:

df = pd.read_csv('/Users/rachel/Sites/pandas/py/pandas/4_read_write_to_excel/stock_data.csv', skiprows=1)

也就是把第二個引數改為 skiprows=1, 意思就是要忽略的行數.\
兩種方式都能得到相同的結果. 

- 如果 csv 檔案本身沒有表頭, 也就是所有的列名都不存在, 但是我們在引入的時候, 我們瞭解每一列都是什麼值, 也就是說我們要如何在引入檔案的時候自定義列名:
df = pd.read_csv('/Users/rachel/Sites/pandas/py/pandas/4_read_write_to_excel/stock_data.csv', names=['stickers', 'eps', 'revenue', 'price', 'people'])
- 讀取指定的幾行資料

現在我們把 csv 檔案再還原到初始狀態, 看下,如果我們只想讀取其中的3條資料, 只要加上引數 nrows=3 即可:

df = pd.read_csv('/Users/rachel/Sites/pandas/py/pandas/4_read_write_to_excel/stock_data.csv', nrows=3)
- 整理資料, 統一空值和不合理的值

現在來具體看下錶格中的資料, 會發現有些資料是沒有的, 從 csv 檔案中匯入過來的資料看起來也有點亂, 有的寫的是 'n.a.', 有的又是 'not available', 對於這些空資料, 在 Pandas 中可以統一為 'NaN'.\
file

df = pd.read_csv('/Users/rachel/Sites/pandas/py/pandas/4_read_write_to_excel/stock_data.csv', na_values=['not available', 'n.a.'])

這裡第二個引數的意思就是, 在讀取檔案的時候, 凡是遇到 'not available', 'n.a.' 都統一設為空值 'NaN'.

除了空值以外, 還有可能遇到不合理的值, 比如在 'revenue'(收入)列的最後一行, 值是 '-1', 這顯然是不合常理的, 有可能是筆誤或者什麼, 總之, 我們並不知道這個值是什麼, 所以也應該處理為空值'NaN'. 那麼, 我們能直接在第二個引數的中括號裡直接再加上 '-1' 嗎? 理論上是可以實現效果的, 但是我們發現在 'eps' 列也有一個 '-1'的值, 而這個值是合理的, 因此如果我們簡單粗暴地把 '-1'設為'NaN', 就會影響到這個值, 所以, 我們需要這樣做:

df = pd.read_csv('/Users/rachel/Sites/pandas/py/pandas/4_read_write_to_excel/stock_data.csv', na_values={
    'eps':['not available', 'n.a.'],
    'revenue': ['not available', 'n.a.', -1],
    'price': ['not available', 'n.a.'],
    'people': ['not available', 'n.a.']
})

這裡就是通過 dictionary 的資料形式, 具體明確每一列處理空值的方式.

以上就是讀取 CSV 檔案的方法和常見問題, 下面看下如何輸出 CSV 檔案.

- 輸出 CSV 檔案

只需要簡單執行下面這行命令, 就可以生成一個 new.csv 檔案, 至於這個檔案生成在哪裡, 還是去終端看下, 你此時的 jupyter notebook 執行在哪裡:

df.to_csv('new.csv')

file
空值部分全部為空白. 但是多了一列序號索引, 如果想去掉:

df.to_csv('new.csv', index=False)
- 輸出指定的列

如果你只想要把前兩列的內容儲存成 csv 檔案輸出.\
首先檢視一下所有的列名:

df.columns

輸出:

Index(['tickers', 'eps', 'revenue', 'price', 'people'], dtype='object')

只輸出 'tickers' 和 'eps' 列:

df.to_csv('new.csv', columns=['tickers', 'eps'])

這時再檢視一下 new.csv 檔案, 發現裡面真的只有兩列.

- 不輸出表頭, 即列名

設定第二個引數 header = False 即可:

df.to_csv('new.csv', header = False)

- 讀取 EXCEL 檔案

首先是準備一個 excel 檔案:
file

import pandas as pd
df = pd.read_excel('stock_data.xlsx', 'Sheet1')
df

輸出:\
file

- 整理資料

從上圖, 我們可以看到有一些 n.a. 和 not available 的資料, 我們可以做更有針對性的調整:

def convert_people_cell(cell):
    if cell == 'n.a.':
        return 'Sam Walton'
    return cell

def convert_eps_cell(cell):
    if cell == 'not available':
        return None
    return cell

df = pd.read_excel('stock_data.xlsx', 'Sheet1', converters={
    'people': convert_people_cell
})

- 儲存成 excel 檔案輸出

- 自定義輸出
df.to_excel('new.xlsx', sheet_name='stocks', index=False, startrow=1, startcol=2)

引數說明:\
sheet_name='stocks': 設定 sheet 名稱\
index=False: 去掉序號索引\
startrow=1: 從第二行開始表格\
startcol=2: 從第三列開始表格\
輸出:\
file

- 把兩個 dataframe 輸出到一個 excel 表的兩個 sheet
df_stocks = pd.DataFrame({
    'tickers': ['GOOGL', 'WMT', 'MSFT'],
    'price': [845, 65, 64 ],
    'pe': [30.37, 14.26, 30.97],
    'eps': [27.82, 4.61, 2.12]
})

df_weather =  pd.DataFrame({
    'day': ['1/1/2017','1/2/2017','1/3/2017'],
    'temperature': [32,35,28],
    'event': ['Rain', 'Sunny', 'Snow']
})
with pd.ExcelWriter('stocks_weather.xlsx') as writer:
    df_stocks.to_excel(writer, sheet_name="stocks")
    df_weather.to_excel(writer, sheet_name="weather")

更多關於 Pandas 讀取/輸出檔案的屬性, 可以參考官網:\
https://pandas.pydata.org/pandas-docs/stab...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章