数据分析(一)
目錄
數據加載
一、加載數據
載入數據:?
逐塊讀取
更改表頭、索引
初步觀察數據
?保存數據
pandas基礎
Series
DataFrame
?篩選
探索性數據分析
數據加載
一、加載數據
import numpy as np import pandas as pd載入數據:?
df = pd.read_csv('train.csv') #相對路徑 #絕對路徑如:df = pd.read_csv('C:\Users\Lenovo\train.csv') df.head(3) #輸出頭三行? 思考:tsv和csv的區別,pd.read_csv()和pd.read_table()的不同
各種格式文件讀取:IO tools (text, CSV, HDF5, …) — pandas 1.4.2 documentation
pd.read_csv()一般是讀取csv文件的,pd.read_table()讀取txt文件。函數pd.read_csv()和pd.read_table()的內容相同,只是默認分隔符不同。
在read_csv()中,定界符為 “ , ” ,在read_table()中,定界符為 \ t 。
df = pd.read_table('train.csv') df.head(3)
通過sep=’,’,讓pd.read_table()實現pd.read_csv()的功能:
同理,通過sep=’\t’,讓pd.read_csv()實現pd.read_table()的功能。
逐塊讀取
當讀取的文件較大時,這時若直接利用pandas讀取,會給電腦造成太大的壓力:
chunker = pd.read_csv('train.csv', chunksize=1000) for chunk in chunker:print(chunk)【提示】可以chunker(數據塊)是什么類型?用for循環打印出來出處具體的樣子是什么?
? ?讀取pandas中DataFrame的數據類型。按列豎切切成幾塊讀取,每次讀1000行。
更改表頭、索引
將表頭改成中文,索引改為乘客ID
PassengerId => 乘客ID,Survived => 是否幸存,Pclass => 乘客等級(1/2/3等艙位),Name => 乘客姓名,Sex => 性別,Age => 年齡,SibSp => 堂兄弟/妹個數,Parch => 父母與小孩個數,Ticket => 船票信息,Fare => 票價,Cabin => 客艙,Embarked => 登船港口。
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','倉位等級','姓名','性別','年齡','兄弟姐妹個數','父母子女個數','船票信息','票價','客艙','登船港口'],index_col='乘客ID',header=0) df.head()思考:所謂將表頭改為中文其中一個思路是:將英文列名表頭替換成中文。還有其他的方法嗎??
df = pd.read_csv('train.csv') df.rename(columns={'PassengerId':'乘客ID','Survived':'是否幸存','Pclass' :'倉位等級','Name' :'姓名','Sex' :'性別','Age' :'年齡','SibSp' :'兄弟姐妹個數','Parch' :'父母子女個數','Ticket' :'船票信息','Fare' :'票價','Cabin' :'客艙','Embarked' :'登船港口'}, inplace = True) df =df.set_index('乘客ID') df初步觀察數據
#查看數據的基本信息 df.info()#觀察表格前10行的數據和后15行的數據 df.head(10) df.tail(15)#判斷數據是否為空,為空的地方返回True,其余地方返回False df.isnull().head()?保存數據
#將加載并做出改變的數據,在工作目錄下保存為一個新文件train_chinese.csv df.to_csv('train_chinese.csv')pandas基礎
Series
是一種類似于一維數組的對象,它由一組數據以及一組與之相關的數據便簽(即索引)組成,僅由一組數據即可產生最簡單的Series。
1、直接定義,自動生成索引
a=Series([9,-3,4,2])
輸出:
0? 9
1? -3
2? 4
3? 2
系統會自動為Series數據創建整數索引,可通過Series的values和index屬性獲取其數組表示形式和索引對象:
print(Series.values)
print(Series.index)
與字典型數據的keys(),values(),items()類似。
2、直接將一個字典型數據a轉化為Series數據,Series(a)
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000} example_1 = pd.Series(sdata) example_1鍵值變成index,數據值變成columns。
3、創建Series時可自定義索引值
b=Series([9,-3,4,2],index=['a','c','d','b'])
那么訪問Series中的值時可以直接用b['index']的方法,例如b['c'],b[['d','a']]可以同時選取多個值。
DataFrame
是一個表格型數據,含有一組有序的列,每一列可以是不同的類型值。DataFrame可以看成是由多個Series組成的字典,它們共用一個索引。
在構建DataFrame時,最常用的就是先創建一個data,data一般可以是字典和數組,再用a=DataFrame(data)來轉換為DataFrame結構。在DataFrame(data)時也可以同時傳入index和columns參數,兩個參數必須是列表型。
#DataFrame會自動加上索引 data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],'year': [2000, 2001, 2002, 2001, 2002, 2003],'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]} example_2 = pd.DataFrame(data) example_2?任務:查看DataFrame數據的每列的名稱
df.columns任務:?查看某列的所有值 [有多種方法]
df['Cabin'].head(3)#ordf.Cabin.head(3)任務:加載文件"test_1.csv",然后對比"train.csv",看看有哪些多出的列,然后將多出的列刪除
test_1 = pd.read_csv('test_1.csv') test_1.head(3)多了一列a
刪除多余行:
del test_1['a'] test_1.head(3)?思考:還有其他的刪除多余的列的方式嗎?
有的!
#不同于del方法,drop方法一次可刪除多列 test_1 = test_1.drop(['a'],axis=1,inplace=True) test_1.head(3)任務:將['PassengerId','Name','Age','Ticket']這幾個列元素隱藏,只觀察其他幾個列元素
#利用drop刪除方法,但是未設置inplace=True,故相當于創建副本,隱藏表格內容。 df.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(3)?篩選
以"Age"為篩選條件,顯示年齡在10歲以下的乘客信息。
df[df["Age"]<10].head(3)?以"Age"為條件,將年齡在10歲以上和50歲以下的乘客信息顯示出來,并將這個數據命名為midage:
midage = df[(df["Age"]>10)& (df["Age"]<50)] midage.head(3)將midage的數據中第100行的"Pclass"和"Sex"的數據顯示出來:
midage = midage.reset_index(drop=True) midage.head(3) midage.loc[[100],['Pclass','Sex']]#reset_index()重置索引 #在獲得新的index,原來的index變成數據列,保留在數據框中,不想保留原來的index的話可以使用參數drop=True,默認False。 #因為midage為原數據表摘出來的,索引是打亂的,所以需要reset_index()重置索引,才能進行摘取100行操作。對比iloc和loc的異同:
loc是根據index來索引,比如df定義了一個index,那么loc就根據這個index來索引對應的行。iloc并不是根據index來索引,而是根據行號來索引,行號從0開始,逐次加1。
midage.loc[[100,105,108],['Pclass','Name','Sex']] midage.iloc[[100,105,108],[2,3,4]]探索性數據分析
任務:利用Pandas對示例數據進行排序,要求升序
#自己構建一個都為數字的DataFrame數據 frame = pd.DataFrame(np.arange(8).reshape((2, 4)),#創建一個DataFrame對象 index=['2', '1'], columns=['d', 'a', 'b', 'c']) frameframe.sort_values(by='c', ascending=True) #構建的DataFrame中的數據根據c列,ascending=True升序排列frame.sort_index() # 讓行索引升序排序 frame.sort_index(axis=1) # 讓列索引升序排序 frame.sort_index(axis=1, ascending=False) # 讓列索引降序排序 frame.sort_values(by=['a', 'c'], ascending=False)# 讓a,c兩列數據同時降序排序任務:利用Pandas進行算術計算,計算兩個DataFrame數據相加結果
frame1_a = pd.DataFrame(np.arange(9.).reshape(3, 3),columns=['a', 'b', 'c'],index=['one', 'two', 'three']) frame1_b = pd.DataFrame(np.arange(12.).reshape(4, 3),columns=['a', 'e', 'c'],index=['first', 'one', 'two', 'second']) frame1_a frame1_b frame1_a + frame1_b? ? +? ? ? ?? ?=
現在通過泰坦尼克號數據如何計算出在船上最大的家族有多少人?
''' 還是用之前導入的chinese_train.csv如果我們想看看在船上,最大的家族有多少人(‘兄弟姐妹個數’+‘父母子女個數’),我們該怎么做呢? ''' max(text['兄弟姐妹個數'] + text['父母子女個數'])?任務:Pandas describe()函數查看數據基本統計信息
#建立一個例子 frame2 = pd.DataFrame([[1.4, np.nan], [7.1, -4.5],[np.nan, np.nan], [0.75, -1.3]], index=['a', 'b', 'c', 'd'], columns=['one', 'two']) frame2?
# 調用 describe 函數,觀察frame2的數據基本信息frame2.describe()''' count : 樣本數據大小 mean : 樣本數據的平均值 std : 樣本數據的標準差 min : 樣本數據的最小值 25% : 樣本數據25%的時候的值 50% : 樣本數據50%的時候的值 75% : 樣本數據75%的時候的值 max : 樣本數據的最大值 '''?現在分別看看泰坦尼克號數據集中 票價、父母子女 這列數據的基本統計數據:
''' 看看泰坦尼克號數據集中 票價 這列數據的基本統計數據 ''' text['票價'].describe()------------------------------------------------------------------------------------------- ''' count 891.000000 mean 32.204208 std 49.693429 min 0.000000 25% 7.910400 50% 14.454200 75% 31.000000 max 512.329200 Name: 票價, dtype: float64 '''總結
- 上一篇: 基于intel x86+fpga智能驾驶
- 下一篇: 使用Acorn for Mac制作漫画文