上层目录 总目录
一、Pandas概述
1. 导入Pandas
2. 读取csv文件
3. 显示csv文件的前几行
4. 查看DataFrame的信息
5. 查看DataFrame的索引
6. 查看DataFrame的列名
7. 查看DataFrame每一列的类型
8. 查看DataFrame的数值
9. 创建一个DataFrame
二、Pandas基本操作
1. 看DataFrame中某一列的数据,即得到Series对象
2. 看Series对象的前几行数据
3. 修改DataFrame中的某一列做为索引
4. 从Series对象中获取数据
5. Series的计算(加减乘除,求均值,求最值)
6. 使用df.describe()命令对整个DateFrame进行统计分析
三、Pandas索引
1. 获取多个列
2. 获取行数据
3. boolean类型的索引
一、Pandas概述
Pandas是数据分析处理库。
一般都是用Pandas做数据的读取和处理的,很少用Numpy去做。Numpy做计算比较多,但是在数据层面上,用Pandas做起来更方便。
Pandas是封装在numpy之上,形成的一个必杀技,所以更强大。
实验1. 导入Pandas
实验2. 读取csv文件,并显示
import pandas as pd #导入pands。
df = pd.read_csv('F:/data/train.csv') #一会再讲dataFrame是什么东西。把数据从csv当中读进来。
print(df)
|
运行结果:

从结果可以看到,把所有内容都显示出来了。
实验3. 只显示前面几行。
前面的例子可以看到,显示的数据太多了。我们其实就想看看数据长什么样,不需要都列出来。可以使用.head()来显示前几条。
df.head(10) #指定显示前10条数据。如果不写默认显示5条。【例1】
df[:4] #指定显示前4行数据。【例2】
df[2:5] #显示2,3,4三行数据。【例3】
例1:
import pandas as pd
df=pd.read_csv('F:/data/train.csv')
print(df.head())
|
运行结果:

例2:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = df[:5]
print(a)
|
运行结果:

例3:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = df[2:5]
print(a)
|
运行结果:

实验4.想看一下df的信息。
df.info() //返回当前的信息。
【代码】
import pandas as pd
df=pd.read_csv('F:/data/train.csv')
print(df.info())
|
运行结果:
<class 'pandas.core.frame.DataFrame'> #df是DataFrame结构。这是pandas最核心的结构。
RangeIndex: 891 entries, 0 to 890 #当前索引一共891个。从0到890。
Data columns (total 12 columns): #当前数据一共12列。下面分别打出每一列的信息。
PassengerId 891 non-null int64 #第一列叫PassengerId。有891个值。
Survived 891 non-null int64
Pclass 891 non-null int64
Name 891 non-null object #object类型就是String类型的串。串在pandas中是object类型。
Sex 891 non-null object
Age 714 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Ticket 891 non-null object
Fare 891 non-null float64
Cabin 204 non-null object
Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB #当前占多少内存。
None
实验5:看一下df的索引。
import pandas as pd
df=pd.read_csv('F:/data/train.csv')
print(df.index)
|
运行结果:
RangeIndex(start=0, stop=891, step=1)
实验6:看一下df的列名。列名就是数据表中的第一行。
import pandas as pd
df=pd.read_csv('F:/data/train.csv')
print(df.columns)
|
运行结果:
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
实验7:看一下每一列的类型。
import pandas as pd
df=pd.read_csv('F:/data/train.csv')
print(df.dtypes)
|
运行结果:
PassengerId int64
Survived int64
Pclass int64
Name object
Sex object
Age float64
SibSp int64
Parch int64
Ticket object
Fare float64
Cabin object
Embarked object
dtype: object
实验8:看一下df的数值。
import pandas as pd
df=pd.read_csv('F:/data/train.csv')
print(df.values)
|
运行结果:
[[1 0 3 ... 7.25 nan 'S']
[2 1 1 ... 71.2833 'C85' 'C']
[3 1 3 ... 7.925 nan 'S']
...
[889 0 3 ... 23.45 nan 'S']
[890 1 1 ... 30.0 'C148' 'C']
[891 0 3 ... 7.75 nan 'Q']]
实验9:自己创建一个DataFarme结构
刚才讲了,怎么读取文件,然后看一下文件的信息。那能不能自己创建一个DataFrame结构呢?可以。
数据要有列名,还有有值。可以通过字典来创建。字典的key代表列名,value代表值。
代码:
import pandas as pd
data = {'country':['aaa','bbb','ccc'],
'population':[10,12,14]
}
df_data = pd.DataFrame(data)
print(df_data)
print()
print(df_data.info())
|
运行结果:
country population
0 aaa 10
1 bbb 12
2 ccc 14
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
country 3 non-null object
population 3 non-null int64
dtypes: int64(1), object(1)
memory usage: 128.0+ bytes
None
通过上面的例子,我们可以自己读,也可以创建DataFrame。但一般情况下都是从文件里面读文件。具体怎么得到,看自己的需求。
二、Pandas基本操作
实验1:看DataFrame中某一列的数据。
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df)
print(df['Age']) #注意要加单引号。
|
运行结果:
0 22.0
1 38.0
2 26.0
3 35.0
4 35.0
5 NaN
6 54.0
7 2.0
8 27.0
9 14.0
10 4.0
11 58.0
.....
888 NaN
889 26.0
890 32.0
Name: Age, Length: 891, dtype: float64
我们发现第5个为NaN。表示“not a number”,
实验2:单独取的这一列也太多了,只要前几列。
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
data =df['Age']
print(type(data)) #是一个Series类型。
print(data[:5]) #取0到5(不含)的元素。
|
运行结果:
<class 'pandas.core.series.Series'>
0 22.0
1 38.0
2 26.0
3 35.0
4 35.0
Name: Age, dtype: float64
DataFrame中的一行或者一列都可以叫做Series结构。
Series结构也有一些属性,跟DataFrame的差不多。
例1:看一下Series的索引。
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
age =df['Age']
print(age.index)
|
运行结果:
RangeIndex(start=0, stop=891, step=1)
例2:看一下Series的值。
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
age =df['Age']
print(age.values[:6]) #要加s.
|
运行结果:
[22. 38. 26. 35. 35. nan] #得到的是一个列表。
实验3:使用DataFrame的某一列作为索引。
之前的索引是0,1,2,3...能不能改成Name这一列。即改变索引,用name作为索引。
代码:
import pandas as pd
df = pd.read_csv('F:/data/train.csv') #读文件
df = df.set_index('Name') #改成Name用Name做索引
print(df.head()) #查看前5行数据
print(df['Age'][:5]) #取“Age”这一列,显示前5行数据。
|
运行结果:

发现改变索引之后,结果清晰多了。查看Age这一列,也能知道是谁的年龄了。
实验4:Series通过索引找相应的值。
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
age = df['Age']
print(age['Allen, Mr. William Henry'])
|
运行结果:
35.0
实验5:Series计算。
跟Numpy差不多。类似于Numpy的广播的效果,会对每一个值都加上10。
例1:年龄同时加10.
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
age = df['Age']
print(age[:5])
age = age +10
print(age[:5])
|
运行结果:

例2:求年龄的一些统计值。
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
age = df['Age']
print(age.mean()) #求年龄的平均值。
print(age.max())
print(age.min())
print(age.sum())
|
运行结果:
29.69911764705882
80.0
0.42
21205.17
实验6:DataFrame的计算
df.sum() #把每一列都求和。【例1】
df.sum()['Age'] #结果等同于 df['Age'].sum()。【例2】
例1:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df.sum())
|
运行结果:

例2:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df.sum()['Age'])
|
运行结果:
21205.17
实验7:df.describe()统计信息
挨个列统计最大最小值等太麻烦了,可以用df.describe()命令对整个DateFrame进行统计分析。
注意:只统计有数值的这些列。姓名啊之类的列根本就没有统计。
代码:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
print(df.describe())
|
运行结果:

count //当前这一列有多少个不为空的样本。
其他表示这一列的均值、标准差、最小值、最大值、分位数。
三、Pandas索引
下面来说一下,在pandas当中,怎么对数据进行索引。这个其实跟Numpy差不多。只不过它的用法更为丰富了一些。
实验1:获取多个列
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df[['Age','Fare']][:5] #注意两个中括号。要把'Age'和'Fare'作为整体传到df当中。
print(df)
|
运行结果:
Age Fare
0 22.0 7.2500
1 38.0 71.2833
2 26.0 7.9250
3 35.0 53.1000
4 35.0 8.0500
实验2:DataFrame获取行数据
df['0']/df[0] //错误写法。DataFrame不能通过索引直接取得一行数据。【例1】。需要用到loc和iloc。
df.iloc[0] //用位置来定位。【例2】
df.iloc[2:5] //拿到2,3,4三行数据。【例3】
df.iloc[2:5,:3] //切片。要2,3,4行,0,1,2列的数据。【例4】
df.loc['liupc'] //如果之前索引改成了"Name",则要通过loc来取一行。【例5】
df.loc['liupc','Age'] //可以定位到具体的一个值。【例6】
df.loc['liupc':'lijing',:] //从liupc这一行到lijing这一行,所有列的数据。【例7】
df.iloc[0,'Age'] //错误写法。应该是不能混用。要么里面全是数字,要么里面全是字符串。 df.loc['Heikkinen, Miss. Laina',2] //错误写法。应该是不能混用。
df.iloc[0]['Age'] //正确。这种写法相当于 a=df.iloc[0] b=a['Age']。
df.loc['Heikkinen, Miss. Laina','Age'] = 99 //修改值。 【例8】
总结:
loc //如果用标签来做定位,用loc。
iloc //用具体的一个值(一个位置)来定位,用iloc。
ix //有的人还在用df.ix['liupc']这种写法。但是ix要被遗弃了,以后就不要用了。现在只用loc和iloc就行。
没有df['aaa','bbb']这种写法。当作取'aaa'和'bbb'这两列吧,少了中括号。当作取'aaa'行'bbb'列吧,前面没有loc。所以压根就没有这种写法。
例1:不能通过索引,直接获取DataFrame的行。
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df[0])
|
运行结果:
KeyError: 0
例2:拿一行数据。
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df.iloc[0]) #使用iloc(),通过位置来定位。
|
运行结果:

例3:拿多行数据。
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df.iloc[2:5]) #拿3行数据。
|
运行结果:

例4:不光拿行,还筛选列。
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df.iloc[2:5,:2])
|
运行结果:

例5:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df =df.set_index('Name') #改变索引。
print(df.loc['Allen, Mr. William Henry']) #通过loc来获取。
|
运行结果:

例6:定位到具体的一个值。
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df =df.set_index('Name')
print(df.loc['Allen, Mr. William Henry','Age'])
|
运行结果:
35.0
例7:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df =df.set_index('Name')
print(df.loc['Heikkinen, Miss. Laina':'Allen, Mr. William Henry',:])
|
运行结果:

例8:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
print(df.loc['Heikkinen, Miss. Laina','Age']);
df.loc['Heikkinen, Miss. Laina','Age']=100
print(df.loc['Heikkinen, Miss. Laina','Age']);
|
运行结果:
26.0
100.0
实验3:bool类型的索引
df[df['Age']>40] #首先,df['Age']>40得到的是一串True或者False。这个本身就是索引。【例1】
#然后,把这个索引传给df,可以筛选出Age>40的那些行。【例2】
df[df['Sex']=='male'] #取出男性。【例3】
df.loc[df['Sex']=='male','Age'].mean() #可以统计部分数据。男性,对Age这一列求平均值。【例4】
#也可以写:df.loc[df['Sex']=='male','Age'].mean()
#不能写:df[df['Sex']=='male','Age'].mean()
(df['Age']>70).sum() #年龄大于70的有多少人。【例5】
例1:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
print(df['Age']>40)
|
运行结果:

例2:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = df[df['Age']>40]
print(type(a)) #还是一个DataFrame类型。
b=a['Age'][:10] #去Age这一列,前10行。
print(b) #相当于print(df[df['Age']>40]['Age'][:10])
|
运行结果:

可以看到a的年龄都大于40。
例3:取出男性
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name') #修改索引
a = df[df['Sex']=='male'][:10] #使用boolean索引取出男性,要前十行。
print(a)
|
运行结果:

例4:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = df.loc[df['Sex']=='male','Age'].mean()
print(a)
|
运行结果:
30.72664459161148
例5:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = (df['Age']>70).sum() #统计年龄大于70的人数
print(a)
b=df[df['Age']>70]['Age']
print(b)
|
运行结果:

|