pandas常用知識
一、讀取csv文件爲dataframe
二、dataframe的數據概況
三、取列數據
四、取行數據
五、取某一單元格數據
六、缺失值處理
七、歸一化處理
八、排序
九、索引重新編號
十、求均值
十一、矢量化操作(批量操作)
十二、透視表
一、讀取csv文件爲dataframe
pandas很好的一點是,可以操作表文件。輸出爲dataframe格式,這點很nice。
使用pandas.read_csv()讀取csv文件,輸出爲dataframe格式數據。
這裏數據tran.csv數據集下載自kaggle網站。
import pandas as pd
filepath = r'/Users/suosuo/Desktop/titanic/train.csv'
df = pd.read_csv(filepath)
#爲了方便,我只顯示三行,其實結果並不是這樣子
print(df)
輸出結果
PassengerId Survived Pclass \
0 1 0 3
1 2 1 1
2 3 1 3
Name Sex Age SibSp \
0 Braund, Mr. Owen Harris male 22.0 1
1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1
2 Heikkinen, Miss. Laina female 26.0 0
Parch Ticket Fare Cabin Embarked
0 0 A/5 21171 7.2500 NaN S
1 0 PC 17599 71.2833 C85 C
2 0 STON/O2. 3101282 7.9250 NaN S
檢查數據類型
檢測下數據格式是否爲DataFrame
print(type(df))
運行結果
<class 'pandas.core.frame.DataFrame'>
二、 DataFrame數據概況
我們想知道數據如下知識: 1. 展示dataframe前後幾條記錄 2. 顯示dataframe的列名字 3. 查看dataframe的維度情況(幾行幾列)
2.1展示dataframe前後幾行
#展示前兩條記錄(根據需要顯示條數)
df.head(2)
運行結果
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
#展示後三條記錄
df.tail(3)
運行結果
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
888 889 0 3 Johnston, Miss. Catherine Helen "Carrie" female NaN 1 2 W./C. 6607 23.45 NaN S
889 890 1 1 Behr, Mr. Karl Howell male 26.0 0 0 111369 30.00 C148 C
890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q
2.2展示dataframe列名
#展示列名
col_names = df.columns
col_names
運行結果
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
#查看下col_namesgeshi
type(col_names)
運行結果
pandas.indexes.base.Index
#將col_names轉化爲list
col_list = col_names.tolist()
col_list
運行結果
['PassengerId',
'Survived',
'Pclass',
'Name',
'Sex',
'Age',
'SibSp',
'Parch',
'Ticket',
'Fare',
'Cabin',
'Embarked']
三、從dataframe中取列數據
使用dataframe[column_name],返回series格式數據。
series序列數據類似於list,你可以近似等同於list。
只不過返回數據中會多一列index索引。如下面的左側數字序號
2.1 取一列數據
#這裏我們一列,如取Name列數據
df['Name'][:5]
運行結果
0 Braund, Mr. Owen Harris
1 Cumings, Mrs. John Bradley (Florence Briggs Th...
2 Heikkinen, Miss. Laina
3 Futrelle, Mrs. Jacques Heath (Lily May Peel)
4 Allen, Mr. William Henry
Name: Name, dtype: object
2.2取多列數據
#這裏返回的數據還是dataframe格式,爲了方便也只顯示前幾條記錄
cols = ['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex']
df[cols]
運行結果
PassengerId Survived Pclass Name Sex
0 1 0 3 Braund, Mr. Owen Harris male
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female
2 3 1 3 Heikkinen, Miss. Laina female
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female
4 5 0 3 Allen, Mr. William Henry male
四、從dataframe中取行數據(記錄)
這裏方法很多,有loc、iloc、ix。我就只寫ix,
總之沒必要學那麼多,搞糊塗了,夠用就好。
ix[row,col] 中括號中第一個參數row是行參數,你想選擇的數據行數。
第二個參數col是列參數,選擇你想要的列數據項。
4.1取一行數據
#第一行所有數據
df.ix[0,:
運行結果
PassengerId 1
Survived 0
Pclass 3
Name Braund, Mr. Owen Harris
Sex male
Age 22
SibSp 1
Parch 0
Ticket A/5 21171
Fare 7.25
Cabin NaN
Embarked S
Name: 0, dtype: object
第一行的某幾列數據
col = ['Survived', 'Pclass', 'Sex']
df.ix[0,col]
運行結果
Survived 0
Pclass 3
Sex male
Name: 0, dtype: object
4.2取多行數據
#取多行數據,所有列。這裏我選擇前5行,所有列.
#這裏是不是很像切片操作。python基礎很重要
df.ix[:5,:]
運行結果
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
5 6 0 3 Moran, Mr. James male NaN 0 0 330877 8.4583 NaN Q
取多行,某幾列
df.ix[:5,col]
運行結果
Survived Pclass Sex
0 0 3 male
1 1 1 female
2 1 3 female
3 1 1 female
4 0 3 male
5 0 3 male
五、取某一單元格數據
會了三四節,這部分其實你已經會了。
比如我想獲取
第一行第一列。df.ix[0,0]
第三行第七列。df.ix[2,6]
df.ix[0,0]
運行結果
1
df.ix[2,6]
運行結果
0
六、缺失值處理
缺失值一般標記爲NaN,處理辦法如下
df.dropna(axis)
默認直接使用df.dropna()
axis=1,按照行進行缺失值處理
axis=0,按照列進行缺失值處理
df.dropna(axis=0,subset)
axis=0,按照列方向處理subset中的列缺失值
subset=[column] subset含有一個或多個列名的的list
6.1按照行進行缺失值處理
df.dropna(axis=1)
#爲了顯示方便,只顯示前五行。
df.dropna(axis=1)
運行結果
PassengerId Survived Pclass Name Sex SibSp Parch Ticket Fare
0 1 0 3 Braund, Mr. Owen Harris male 1 0 A/5 21171 7.2500
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 1 0 PC 17599 71.2833
2 3 1 3 Heikkinen, Miss. Laina female 0 0 STON/O2. 3101282 7.9250
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 1 0 113803 53.1000
4 5 0 3 Allen, Mr. William Henry male 0 0 373450 8.0500
6.2按照列進行缺失值處理
#按照列處理缺失值(爲顯示方便,只顯示前5行)
df.dropna(axis=0)
運行結果
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
6 7 0 1 McCarthy, Mr. Timothy J male 54.0 0 0 17463 51.8625 E46 S
10 11 1 3 Sandstrom, Miss. Marguerite Rut female 4.0 1 1 PP 9549 16.7000 G6 S
11 12 1 1 Bonnell, Miss. Elizabeth female 58.0 0 0 113783 26.5500 C103 S
對指定列進行缺失值處理
df.dropna(axis=0,subset=['Sex','Age'])
運行結果
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
七、歸一化處理
數據集中,不同的列的數據可能在不同量級,如果直接進行分析。模型會認爲數字大的影響力大,數字小的影響力小。
最終結果可能導致量級小的變量被剔除出模型。因此需要將數據歸一化,變成同一量級的數據,這就是歸一化操作。
在這裏我們只對一列操作下,其餘列也需要操作,但爲了方便,這裏只寫一列的歸一化處理。
處理步驟:
- 選取該列的最大值
max_value = df[col].max()
2.該列所有值均除以max_value
這裏要注意,我們會用到pandas特性,矢量化操作,
也就是可以對一個列表進行批量同樣的操作。
#這裏我們選Fare列進行歸一化,先看下Fare的數據
#爲了方便顯示,只顯示了前10個
df['Fare']
運行結果
0 7.2500
1 71.2833
2 7.9250
3 53.1000
4 8.0500
5 8.4583
6 51.8625
7 21.0750
8 11.1333
9 30.0708
Name: Fare, dtype: float64
這裏我們選Fare列進行歸一化
max_value = df['Fare'].max()
max_value
運行結果
512.32920000000001
歸一化,並將數據傳入新列new_Fare
df['new_Fare']=df['Fare']/max_value
df['new_Fare']
運行結果
0 0.014151
1 0.139136
2 0.015469
3 0.103644
4 0.015713
5 0.016510
6 0.101229
7 0.041136
8 0.021731
9 0.058694
Name: new_Fare, dtype: float64
八、排序
df.sort_values(col,inplace,ascending)
col 對col列進行排序
inplace 布爾型值,是否原地操作。True時,操作結果覆蓋掉原始數據,原始數據被修改.False時,新建一個新的數據,原始數據沒有被修改
ascending 布爾型值。升序降序。 False降序,True升序
#對Age列進行降序操作,不修改原始數據
df.sort_values('Age',inplace=False,ascending=False)
運行結果
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked new_Fare
630 631 1 1 Barkworth, Mr. Algernon Henry Wilson male 80.0 0 0 27042 30.0000 A23 S 0.058556
851 852 0 3 Svensson, Mr. Johan male 74.0 0 0 347060 7.7750 NaN S 0.015176
493 494 0 1 Artagaveytia, Mr. Ramon male 71.0 0 0 PC 17609 49.5042 NaN C 0.096626
96 97 0 1 Goldschmidt, Mr. George B male 71.0 0 0 PC 17754 34.6542 A5 C 0.067640
116 117 0 3 Connors, Mr. Patrick male 70.5 0 0 370369 7.7500 NaN Q 0.015127
九、索引重新
將排序後的索引重新排序
df.reset_index(drop)
drop 爲布爾型值,True表示修改原始數據的索引。False保留原始數據索引序列。
df.reset_index(drop=False)
運行結果
index PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked new_Fare
0 630 631 1 1 Barkworth, Mr. Algernon Henry Wilson male 80.0 0 0 27042 30.0000 A23 S 0.058556
1 851 852 0 3 Svensson, Mr. Johan male 74.0 0 0 347060 7.7750 NaN S 0.015176
2 493 494 0 1 Artagaveytia, Mr. Ramon male 71.0 0 0 PC 17609 49.5042 NaN C 0.096626
3 96 97 0 1 Goldschmidt, Mr. George B male 71.0 0 0 PC 17754 34.6542 A5 C 0.067640
4 116 117 0 3 Connors, Mr. Patrick male 70.5 0 0 370369 7.7500 NaN Q 0.015127
十、求平均值
10.1所有列的平均值信息
df.mean()
運行結果
PassengerId 446.000000
Survived 0.383838
Pclass 2.308642
Age 29.699118
SibSp 0.523008
Parch 0.381594
Fare 32.204208
new_Fare 0.062858
dtype: float64
10.2 單個列的平均值
df['Age'].mean()
運行結果
29.69911764705882
十一、矢量化操作(批量操作)
一般對如list樣式的數據批量操作,需要寫循環,但是這樣費時費力。
pandas基於numpy,可進行矢量化操作,一行就能完成複雜的循環語句,而且運行效率還很高。
11.1對Age列批量加10
df['Age']+10).head
運行結果
630 90.0
851 84.0
493 81.0
96 81.0
116 80.5
672 80.0
745 80.0
33 76.0
54 75.0
280 75.0
Name: Age, dtype: float64
11.2對Age列批量減20
df['Age']-10
運行結果
630 70.0
851 64.0
493 61.0
96 61.0
116 60.5
672 60.0
745 60.0
33 56.0
54 55.0
280 55.0
Name: Age, dtype: float64
十二、透視表
類似groupby,這個透視表不好說是什麼意思。大家直接看結果,好不?
df.pivot_table(index=col1,values=col2,aggfunc='numpy函數')
圍繞index參數列,分析各個col2,aggfunc是np函數,當然這裏的aggfunc也可以是自定義函數。
#分析平均年齡對對生存率的影響。
#0爲死亡,1爲生存。
#這裏我們發現年齡對生存率有影響。
import numpy as np
df.pivot_table(index='Survived',values='Age',aggfunc=np.mean)
運行結果
Survived
0 30.626179
1 28.343690
Name: Age, dtype: float64
#分析倉位等級對生存率影響。0爲死亡,1爲生存。
#倉位爲一等二等三等分別取值1,2,3
#一等艙最高級。我們發現倉位等級對生存也有影響。
df.pivot_table(index='Survived',values='Pclass',aggfunc=np.mean)
Survived
0 2.531876
1 1.950292
Name: Pclass, dtype: float64