Pandas 数据结构
学习目标
- 掌握Series的常用属性及方法
- 掌握DataFrame的常用属性及方法
- 掌握更改Series和DataFrame的方法
- 掌握如何导入导出数据
1 Series和DataFrame
- DataFrame和Series是Pandas最基本的两种数据结构
- DataFrame用来处理结构化数据(SQL数据表,Excel表格)
- Series用来处理单列数据,也可以把DataFrame看作由Series对象组成的字典或集合
1.1 创建Series
-
在Pandas中,Series是一维容器,Series表示DataFrame的每一列
- 可以把DataFrame看作由Series对象组成的字典,其中key是列名,值是Series
- Series和Python中的列表非常相似,但是它的每个元素的数据类型必须相同
-
创建 Series 的最简单方法是传入一个Python列表,如果传入的数据类型不统一,最终的dtype通常是object
import pandas as pd s = pd.Series(['banana',42]) print(s)
输出结果
0 banana 1 42 dtype: object
- 上面的结果中,左边显示的0,1是Series的索引
-
创建Series时,可以通过index参数 来指定行索引。(索引即索引,并不是数据本身)
s = pd.Series( ['Wes McKinney','Male'], index = ['Name','Gender']) print(s)
输出结果
Name Wes McKinney Gender Male dtype: object
1.2 创建 DataFrame
-
可以使用字典来创建DataFrame
name_list = pd.DataFrame( { 'Name':['Tome','Bob'], 'Occupation':['Teacher','IT Engineer'], 'age':[28,36]}) # data是字典的格式,键是列名,值是列表-装着列的数据 print(name_list)
输出结果
Name Occupation age 0 Tome Teacher 28 1 Bob IT Engineer 36
-
创建DataFrame的时候可以使用columns参数指定列的顺序,也可以使用index来指定行索引
- data :数据
- columns:指定列的顺序
- index:来指定行索引
name_list = pd.DataFrame( data = { 'Occupation':['Teacher','IT Engineer'],'Age':[28,36]}, columns=['Age','Occupation'], index=['Tome','Bob']) # index这一列被当成索引, print(name_list)
输出结果
Age Occupation Tome 28 Teacher Bob 36 IT Engineer
2 Series 常用操作
注意:
在jupyter notebook中,在方法函数/类后加问号?
,再运行,就可以看函数的说明情况。写代码时要经常参考文档。
在 jupyter notebook中,可以省略print,直接写变量名即可打印变量。
在单元格中可以执行 windows/linux命令: !xxx命令 ,运行单元格
注意区分大小写
2.1 Series常用属性
series 是一个一维数组,没有行列的概念!
一维就是一行 或 是一列。
series.index 取一维数组的索引,即是 取一维数组中每个值的索引!
dataframe 二维数组中取一行 或一列,返回Series一维数组,如果是在二维数组中取一行一维数组再取索引,返回的是这个二维数组的所有列字段名,如果是在二维数组中取一列一维数组再取索引,返回的是这个二维数组的左边所有的行索引(名称存疑?)
pandas在读取csv文件:read_csv方法
data = pd.read_csv(r'data/nobel_prizes.csv',index_col='id') # id这一列会被当作行索引,index_col设置行索引。
print(data) # 显示data数据内容
data.head() # 默认显示前5行 # 这里是在在jupyter notebook中省略print
data.head(10) # 显示前10行
data.tail() # 默认显示后5行
输出结果
year categor= overallMotivation firstname surname motivation share id 941 2017 physics NaN Rainer Weiss "for decisive contributions to the LIGO detect… 2 942 2017 physics NaN Barry C. Barish "for decisive contributions to the LIGO detect… 4 943 2017 physics NaN Kip S. Thorne "for decisive contributions to the LIGO detect… 4 944 2017 chemistry NaN Jacques Dubochet "for developing cryo-electron microscopy for t… 3 945 2017 chemistry NaN Joachim Frank "for developing cryo-electron microscopy for t… 3
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vm237d2z-1685291670251)(img\data_head()].png)
获取df中的一行: loc [一行的索引]
-
使用 DataFrame的 loc 属性 获取数据集里的一行,就会得到一个Series对象
-
使用行索引标签选择一条记录
first_row = data.loc[941] # loc是一个dataframe中的一个属性,941是行索引(上一步加载的时候id这一列变成行索引) type(first_row) # 这里是在在jupyter notebook中省略print # first_row是一个Series对象
输出结果
pandas.core.series.Series # first_row是一个Series对象
print(first_row)
输出结果
year 2017 category physics overallMotivation NaN firstname Rainer surname Weiss motivation "for decisive contributions to the LIGO detect... share 2 Name: 941, dtype: object
S.Index 属性 S.values属性 :获取一维数组的 索引 和 值
-
可以通过 index 和 values 属性获取一维数组的索引和值
print(first_row.index)
输出结果
Index(['year', 'category', 'overallMotivation', 'firstname', 'surname', 'motivation', 'share'], dtype='object')
print(first_row.values)
输出结果
[2017 'physics' nan 'Rainer' 'Weiss' '"for decisive contributions to the LIGO detector and the observation of gravitational waves"' 2]
补充:df.keys()方法:数据集获取所有列字段名
-
Series的keys方法,作用个index属性一样
(可以这样理解:获取数据集的所有字段名)data.keys()
输出结果
Index(['year', 'category', 'overallMotivation', 'firstname', 'surname', 'motivation', 'share'], dtype='object')
总结:Series的一些属性
属性 | 说明 |
loc | 使用索引值取子集,使用行索引获取DataFrame的一行,返回Series |
iloc | 使用索引位置(行号)取子集,使用行号获取DataFrame的一行,返回Series |
dtype或dtypes | Series内容的类型 |
shape | 数据的维数,DataFrame和Series共有此方法 |
size | Series中元素的数量 |
index | Series中的索引 |
values | Series的值 |
print(first_row.dtype) # object
print(data.shape) # (4916, 28)
print(first_row.shape) # (28,) # 从这里可以说明Series是一维的
print(first_row.size) # 28
2.2 Series常用方法
df.列名 或 dataframe[‘列名’] 获取df中的一列
share = data.share #从DataFrame中 获取Share列(几人获奖)返回Series
share = data.share # 从DataFrame中 获取Share列(几人获奖)返回Series
share = data['share']
df[[‘列名’,‘列名’]] 返回dataframe:获取df中的多列,返回df
data[['year']] # 两个方括号返回DataFrame类型,即使只取一列, pandas.core.frame.DataFrame
data[['year','category']] # 取出两列数据,返回dataframe。如果取多个列,只能取dataframe类型
数值型的Series,常见计算:mean()平均 max() min() std()标准差
share = data.share # 从DataFrame中 获取Share列(几人获奖)返回Series
print(type(share) # 类型:pandas.core.series.Series
share.mean() # 计算几人获奖的平均值
输出结果
1.982665222101842
share.max() # 计算最大值
输出结果
4
share.min() # 计算最小值
输出结果
1
share.std() # 计算标准差
输出结果
0.9324952202244597
median() mod() value_counts() describe()
s.value_counts()方法:可以返回不同值的条目数量
movie = pd.read_csv('data/movie.csv') # 加载电影数据
director = movie['director_name'] # 从电影数据中获取导演名字 返回Series
actor_1_fb_likes = movie['actor_1_facebook_likes'] # 从电影数据中取出主演的facebook点赞数
director.head() #查看导演Series数据
movie['director_name'] # 一个方括号返回Series类型
movie[['director_name']] # 两个方括号返回DataFrame类型 pandas.core.frame.DataFrame
movie[['director_name','actor_1_facebook_likes']] # 取出两列数据,如果取多个列,只能取dataframe类型
输出结果
0 James Cameron 1 Gore Verbinski 2 Sam Mendes 3 Christopher Nolan 4 Doug Walker Name: director_name, dtype: object
actor_1_fb_likes.head() #查看主演的facebook点赞数
输出结果
0 1000.0 1 40000.0 2 11000.0 3 27000.0 4 131.0 Name: actor_1_facebook_likes, dtype: float64
pd.set_option('max_rows', 8) # 设置最多显示8行
director.value_counts() # 统计不同导演指导的电影数量
输出结果
Steven Spielberg 26 Woody Allen 22 Clint Eastwood 20 Martin Scorsese 20 .. Gavin Wiesen 1 Andrew Morahan 1 Luca Guadagnino 1 Richard Montoya 1 Name: director_name, Length: 2397, dtype: int64
actor_1_fb_likes.value_counts()
输出结果
1000.0 436 11000.0 206 2000.0 189 3000.0 150 ... 216.0 1 859.0 1 225.0 1 334.0 1 Name: actor_1_facebook_likes, Length: 877, dtype: int64
通过count()方法可以返回有多少非空值
director.count()
输出结果
4814
director.shape
输出结果
(4916,)
通过describe()方法打印描述信息
actor_1_fb_likes.describe()
输出结果
count 4909.000000 mean 6494.488491 std 151