十分钟带你了解pandas常用方法
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()
该列所有值均除以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