查看原文
其他

十分钟带你了解pandas常用方法

2017-06-09 大邓 大邓带你玩python

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)

运行结果


PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
#展示后三条记录
df.tail(3)

运行结果


PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
88888903Johnston, Miss. Catherine Helen "Carrie"femaleNaN12W./C. 660723.45NaNS
88989011Behr, Mr. Karl Howellmale26.00011136930.00C148C
89089103Dooley, Mr. Patrickmale32.0003703767.75NaNQ

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]

运行结果


PassengerIdSurvivedPclassNameSex
0103Braund, Mr. Owen Harrismale
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female
2313Heikkinen, Miss. Lainafemale
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female
4503Allen, Mr. William Henrymale

四、从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,:]

运行结果


PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
5603Moran, Mr. JamesmaleNaN003308778.4583NaNQ

取多行,某几列

df.ix[:5,col]

运行结果


SurvivedPclassSex
003male
111female
213female
311female
403male
503male

五、取某一单元格数据

会了三四节,这部分其实你已经会了。

比如我想获取

第一行第一列。df.ix[0,0]

第三行第七列。df.ix[2,6]

df.ix[0,0]

运行结果

1df.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)

运行结果


PassengerIdSurvivedPclassNameSexSibSpParchTicketFare
0103Braund, Mr. Owen Harrismale10A/5 211717.2500
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female10PC 1759971.2833
2313Heikkinen, Miss. Lainafemale00STON/O2. 31012827.9250
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female1011380353.1000
4503Allen, Mr. William Henrymale003734508.0500

6.2按照列进行缺失值处理

#按照列处理缺失值(为显示方便,只显示前5行)
df.dropna(axis=0)

运行结果


PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
6701McCarthy, Mr. Timothy Jmale54.0001746351.8625E46S
101113Sandstrom, Miss. Marguerite Rutfemale4.011PP 954916.7000G6S
111211Bonnell, Miss. Elizabethfemale58.00011378326.5500C103S

对指定列进行缺失值处理

df.dropna(axis=0,subset=['Sex','Age'])

运行结果


PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS

七、归一化处理

数据集中,不同的列的数据可能在不同量级,如果直接进行分析。模型会认为数字大的影响力大,数字小的影响力小。

最终结果可能导致量级小的变量被剔除出模型。因此需要将数据归一化,变成同一量级的数据,这就是归一化操作。

在这里我们只对一列操作下,其余列也需要操作,但为了方便,这里只写一列的归一化处理。

处理步骤:

  1. 选取该列的最大值

    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)

运行结果


PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkednew_Fare
63063111Barkworth, Mr. Algernon Henry Wilsonmale80.0002704230.0000A23S0.058556
85185203Svensson, Mr. Johanmale74.0003470607.7750NaNS0.015176
49349401Artagaveytia, Mr. Ramonmale71.000PC 1760949.5042NaNC0.096626
969701Goldschmidt, Mr. George Bmale71.000PC 1775434.6542A5C0.067640
11611703Connors, Mr. Patrickmale70.5003703697.7500NaNQ0.015127

九、索引重新

将排序后的索引重新排序

df.reset_index(drop)

drop 为布尔型值,True表示修改原始数据的索引。False保留原始数据索引序列。

df.reset_index(drop=False)

运行结果


indexPassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkednew_Fare
063063111Barkworth, Mr. Algernon Henry Wilsonmale80.0002704230.0000A23S0.058556
185185203Svensson, Mr. Johanmale74.0003470607.7750NaNS0.015176
249349401Artagaveytia, Mr. Ramonmale71.000PC 1760949.5042NaNC0.096626
3969701Goldschmidt, Mr. George Bmale71.000PC 1775434.6542A5C0.067640
411611703Connors, Mr. Patrickmale70.5003703697.7500NaNQ0.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



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存