動手做資料分析12.13
12.13週一
在使用絕對路徑載入資料時報錯 OSError: [Errno 22] Invalid argument
解決方法是手打一遍路徑,不直接複製貼上,複製黏貼就會出現此錯誤
1 第一章:資料載入及初步觀察
1.1 載入資料
資料集下載 https://www.kaggle.com/c/titanic/overview
1.1.1 任務一:匯入numpy和pandas
In [6]:
#寫入程式碼
import numpy as np
import pandas as pd
【提示】如果載入失敗,學會如何在你的python環境下安裝numpy和pandas這兩個庫
1.1.2 任務二:載入資料
(1) 使用相對路徑載入資料 (2) 使用絕對路徑載入資料
In [28]:
#寫入程式碼
import os
os.getcwd()
data = pd.read_csv('train.csv')
data
data2 = pd.read_table('train.csv')
#data2
In [22]:
#寫入程式碼
data1=pd.read_csv('E:\\人工智慧學習\\hands-on-data-analysis-master\\第一單元專案集合\\train.csv')
data1
Out[22]:
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 |
0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 |
53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | 887 | 0 | 2 | Montvila, Rev. Juozas | male | 27.0 | 0 | 0 | 211536 | 13.0000 | NaN | S |
887 | 888 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19.0 | 0 | 0 | 112053 | 30.0000 | B42 | S |
888 | 889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | NaN | 1 | 2 | W./C. 6607 | 23.4500 | NaN | S |
889 | 890 | 1 | 1 | Behr, Mr. Karl Howell | male | 26.0 | 0 | 0 | 111369 | 30.0000 | C148 | C |
890 | 891 | 0 | 3 | Dooley, Mr. Patrick | male | 32.0 | 0 | 0 | 370376 | 7.7500 | NaN | Q |
891 rows × 12 columns
【提示】相對路徑載入報錯時,嘗試使用os.getcwd()檢視當前工作目錄。
【思考】知道資料載入的方法後,試試pd.read_csv()和pd.read_table()的不同,如果想讓他們效果一樣,需要怎麼做?瞭解一下'.tsv'和'.csv'的不同,如何載入這兩個資料集?
答:read_table的預設分隔符為"\t"
pd.read_csv輸出的資料是多少個特徵就多少列,而pd.read_table()是無論多少特徵只有一列
tsv用製表符"/t"分隔,csv則是用','作為字元分隔符
【總結】載入的資料是所有工作的第一步,我們的工作會接觸到不同的資料格式(eg:.csv;.tsv;.xlsx),但是載入的方法和思路都是一樣的,在以後工作和做專案的過程中,遇到之前沒有碰到的問題,要多多查資料嗎,使用google,瞭解業務邏輯,明白輸入和輸出是什麼。
1.1.3 任務三:每1000行為一個數據模組,逐塊讀取
In [33]:
#寫入程式碼
chunker = pd.read_csv('train.csv', chunksize=1000)
print(type(chunker))
for chunker in data:
print(chunker)
<class 'pandas.io.parsers.TextFileReader'>
PassengerId
Survived
Pclass
Name
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked
【思考】什麼是逐塊讀取?為什麼要逐塊讀取呢?
每次進行迭代的時候是一個DataFrame的結構,逐塊讀取可以減少資源消耗,提高效率
【提示】大家可以chunker(資料塊)是什麼型別?用`for`迴圈打印出來出處具體的樣子是什麼?
打印出來是特徵名?
1.1.4 任務四:將表頭改成中文,索引改為乘客ID [對於某些英文資料,我們可以通過翻譯來更直觀的熟悉我們的資料]
PassengerId => 乘客ID Survived => 是否倖存 Pclass => 乘客等級(1/2/3等艙位) Name => 乘客姓名 Sex => 性別 Age => 年齡 SibSp => 堂兄弟/妹個數 Parch => 父母與小孩個數 Ticket => 船票資訊 Fare => 票價 Cabin => 客艙 Embarked => 登船港口
In [43]:
#寫入程式碼
#方法1
data = pd.read_csv('train.csv', names=['乘客ID', '是否倖存', '乘客等級(1/2/3等艙位)', '乘客姓名', '性別', '年齡', '堂兄弟/妹個數', '父母與小孩個數', '船票資訊', '票價', '客艙', '登船港口'],index_col='乘客ID', header=0 )
#方法2
df1=pd.read_csv('train.csv')
df1.rename(columns={'Survived':'是否倖存', 'Pclass':'倉位等級', 'name':'姓名'}, inplace = True)#可以修改部分或者全部
#方法3
df2=pd.read_csv('train.csv')
df2.columns=['乘客ID','是否倖存','倉位等級','姓名','性別','年齡','兄弟姐妹個數','父母子女個數','船票資訊','票價','客艙','登船港口']
#該方法的新列名必須要與原列名一一對應
data
df1.head()
df2.head()
【思考】所謂將表頭改為中文其中一個思路是:將英文列名錶頭替換成中文。還有其他的方法嗎?
1.2 初步觀察
匯入資料後,你可能要對資料的整體結構和樣例進行概覽,比如說,資料大小、有多少列,各列都是什麼格式的,是否包含null等
1.2.1 任務一:檢視資料的基本資訊
In [44]:
#寫入程式碼
data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 891 entries, 1 to 891
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 是否倖存 891 non-null int64
1 乘客等級(1/2/3等艙位) 891 non-null int64
2 乘客姓名 891 non-null object
3 性別 891 non-null object
4 年齡 714 non-null float64
5 堂兄弟/妹個數 891 non-null int64
6 父母與小孩個數 891 non-null int64
7 船票資訊 891 non-null object
8 票價 891 non-null float64
9 客艙 204 non-null object
10 登船港口 889 non-null object
dtypes: float64(2), int64(4), object(5)
memory usage: 83.5+ KB
【提示】有多個函式可以這樣做,你可以做一下總結
1.2.2 任務二:觀察表格前10行的資料和後15行的資料
In [1]:
#寫入程式碼
data.head(10)
In [46]:
#寫入程式碼
data.tail(15)
data.iloc[-15:,:]
Out[46]:
是否倖存 | 乘客等級(1/2/3等艙位) | 乘客姓名 | 性別 | 年齡 | 堂兄弟/妹個數 | 父母與小孩個數 | 船票資訊 | 票價 | 客艙 | 登船港口 | |
---|---|---|---|---|---|---|---|---|---|---|---|
乘客ID | |||||||||||
877 | 0 | 3 | Gustafsson, Mr. Alfred Ossian | male | 20.0 | 0 | 0 | 7534 | 9.8458 | NaN | S |
878 | 0 | 3 | Petroff, Mr. Nedelio | male | 19.0 | 0 | 0 | 349212 | 7.8958 | NaN | S |
879 | 0 | 3 | Laleff, Mr. Kristo | male | NaN | 0 | 0 | 349217 | 7.8958 | NaN | S |
880 | 1 | 1 | Potter, Mrs. Thomas Jr (Lily Alexenia Wilson) | female | 56.0 | 0 | 1 | 11767 | 83.1583 | C50 | C |
881 | 1 | 2 | Shelley, Mrs. William (Imanita Parrish Hall) | female | 25.0 | 0 | 1 | 230433 | 26.0000 | NaN | S |
882 | 0 | 3 | Markun, Mr. Johann | male | 33.0 | 0 | 0 | 349257 | 7.8958 | NaN | S |
883 | 0 | 3 | Dahlberg, Miss. Gerda Ulrika | female | 22.0 | 0 | 0 | 7552 | 10.5167 | NaN | S |
884 | 0 | 2 | Banfield, Mr. Frederick James | male | 28.0 | 0 | 0 | C.A./SOTON 34068 | 10.5000 | NaN | S |
885 | 0 | 3 | Sutehall, Mr. Henry Jr | male | 25.0 | 0 | 0 | SOTON/OQ 392076 | 7.0500 | NaN | S |
886 | 0 | 3 | Rice, Mrs. William (Margaret Norton) | female | 39.0 | 0 | 5 | 382652 | 29.1250 | NaN | Q |
887 | 0 | 2 | Montvila, Rev. Juozas | male | 27.0 | 0 | 0 | 211536 | 13.0000 | NaN | S |
888 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19.0 | 0 | 0 | 112053 | 30.0000 | B42 | S |
889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | NaN | 1 | 2 | W./C. 6607 | 23.4500 | NaN | S |
890 | 1 | 1 | Behr, Mr. Karl Howell | male | 26.0 | 0 | 0 | 111369 | 30.0000 | C148 | C |
891 | 0 | 3 | Dooley, Mr. Patrick | male | 32.0 | 0 | 0 | 370376 | 7.7500 | NaN | Q |
1.2.4 任務三:判斷資料是否為空,為空的地方返回True,其餘地方返回False
In [47]:
#寫入程式碼
data.isnull()
Out[47]:
是否倖存 | 乘客等級(1/2/3等艙位) | 乘客姓名 | 性別 | 年齡 | 堂兄弟/妹個數 | 父母與小孩個數 | 船票資訊 | 票價 | 客艙 | 登船港口 | |
---|---|---|---|---|---|---|---|---|---|---|---|
乘客ID | |||||||||||
1 | False | False | False | False | False | False | False | False | False | True | False |
2 | False | False | False | False | False | False | False | False | False | False | False |
3 | False | False | False | False | False | False | False | False | False | True | False |
4 | False | False | False | False | False | False | False | False | False | False | False |
5 | False | False | False | False | False | False | False | False | False | True | False |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
887 | False | False | False | False | False | False | False | False | False | True | False |
888 | False | False | False | False | False | False | False | False | False | False | False |
889 | False | False | False | False | True | False | False | False | False | True | False |
890 | False | False | False | False | False | False | False | False | False | False | False |
891 | False | False | False | False | False | False | False | False | False | True | False |
891 rows × 11 columns
【總結】上面的操作都是資料分析中對於資料本身的觀察
【思考】對於一個數據,還可以從哪些方面來觀察?找找答案,這個將對下面的資料分析有很大的幫助
1.3 儲存資料
1.3.1 任務一:將你載入並做出改變的資料,在工作目錄下儲存為一個新檔案train_chinese.csv
In [50]:
#寫入程式碼
# 注意:不同的作業系統儲存下來可能會有亂碼。大家可以加入`encoding='GBK' 或者 ’encoding = ’utf-8‘‘`
data.to_csv('saved_train.csv',encoding='gbk')
【總結】資料的載入以及入門,接下來就要接觸資料本身的運算,我們將主要掌握numpy和pandas在工作和專案場景的運用。