
【千锋教育干货暴击】
如果你想更好的学习Python乃至转行,弯道超车,快人一步!本课程零基础即可加入学习,抓住大数据、机器学习、人工智能时代的红利,开启你的第一行代码吧!
↓ ↓ ↓
千锋教育Python教程_700集零基础Python入门到精通教程(保姆级新手教程)
千锋教育Python教程全套_python零基础入门到精通(学完可达到Python工程师水平)

就在大家撒狗粮,秀恩爱的520,佟丽娅和陈思诚离婚了!

根据民政部门的大数据显示,我国的离婚率已经连续8年升高,而结婚率已经连续5年下降。
今天给大家展示的是一份从2007到2020年的各个省份各个季度的离婚情况表,表结构如下(截取部分):

我们通过操作这张表,学习DataFrame的索引、切片和一些算术操作。我们知道DataFrame是一个二维的数据结构,我们学习过Series的索引和切片,只不过它是一个一维的。但是两者在使用上还是很类似的。
我们回顾下Series的索引,Series的索引上次我们给大家介绍了:
位置下标
标签索引
布尔型索引
切片索引 那DataFrame是否也有这些呢?我们通过2007-2020全国结婚离婚数据.csv这个数据表来去看一下。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
data = pd.read_csv('2007-2020全国结婚离婚数据.csv')
# 因为在列名下面有一个空行我们删除掉
data = data.dropna()
# 获取2020年第一季度结婚数 (即某一列数据)
data['2020年第1季度结婚登记']
data数据如下所示:


# 获取北京市2007-2020年的所有数据(即一行数据)
data[3] # 使用行标签3是否可以呢? 此时有报错:KeyError: 3,因此对于DataFrame来说,我们不能直接使用索引值访问行。
所以我们分别从行和列两个方面给大家介绍索引访问,先来看一张表格

显式访问具体效果展示:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
# 将表格的第一列设置为行索引,添加index_col=0
data = pd.read_csv('2007-2020全国结婚离婚数据.csv',index_col=0)
data = data.dropna()
# 显式获取指定列
col1 = data['2007年第1季度结婚登记']
print(col1)
# 显式获取指定行
row1 = data.loc['上海市']
print(row1)
# 显式获取多个指定列
col_list = data[['2007年第1季度结婚登记','2007年第2季度结婚登记','2007年第3季度结婚登记']]
print(col_list)
# 显式获取多个指定行
row_list = data.loc[['北京市','上海市','天津市']]
print(row_list)

我们知道隐式索引,行和列都是使用默认的整数作为索引值(从0开始,默认向后数),即

对于数字我们是看不到的,所以我们称为隐式。
列的访问使用的是:iloc[行,列] 行或者列位置如果使用【:】则表示获取所有的行或者所有的列。
隐式访问具体效果展示:
# 单行的获取
row1 = data.iloc[3]
print(row1)
# 多行获取
row_list = data.iloc[[3,5,7,9]]
print(row_list)
# 单列获取
col = data.iloc[:,3]
print(col)
# 多列获取 (不连续的列)
col_list = data.iloc[:,[2,4,6]]
print(col_list) 数据比较多,这里就不给大家截图展示了。
切片的概念同前面Series中说到的切片一样,当我们要获取连续的多行或者多列数据的时候考虑使用切片。 切片也是获取多行或者多列数据的一种方式。代码展示(大家可以注释其他的,逐个演示哦):
# 连续多行获取
row_list1 = data.loc['北京市':'吉林省']
print(row_list1)
row_list2 = data['北京市':'吉林省':2]
print(row_list2)
# 隐式连续多行
row_list3 = data.iloc[3:10]
print(row_list3)
# 隐式多列获取 (连续的列)
col_list2 = data.iloc[:,2:6]
print(col_list2)
# 指定步长
col_list3 = data.iloc[:,2:10:2]
print(col_list3)
# 指定行列和步长
data1 = data.iloc[2:15:2:2:10:3]
print(data1) 另外loc还可以支持bool列表的形式,我们使用一个简单的数据给大家展示。
df = pd.DataFrame([[1, 2, 3,4], [4, 5, 6,7]], index=['row0', 'row1'], columns=['col0', 'col1', 'col2','col3'])
df.loc[[True,False]] 结果:

当然还可以有条件的获取,指定的行或者列。代码如下:
df = pd.DataFrame([[1, 2, 3,4], [4, 5, 6,7], [8, 9, 10,11]], index=['row0', 'row1','row2'], columns=['col0', 'col1', 'col2','col3'])
df.loc[df['col1']>=5] # 获取col1列数值大于5的行
# df.loc[:,df.loc['row1']>5] # 获取row1值大于5的列

问题来啦!如果获取北京市2017年第1季度结婚登记的结婚数据如何获取呢?那就是元素获取了。 我们给大家分了如下几种获取方式:
先获取行在获取列,如:df.loc["北京市"]["2017年第1季度结婚登记"]
先获取列在获取行,如:df["2017年第1季度结婚登记"]["北京市"]
二维形式进行获取单个值,如:df.loc["北京市","2017年第1季度结婚登记"] 或者 df.iloc[行隐式索引,列隐式索引]
data.loc["北京市"]["2017年第1季度结婚登记"]
# data["2017年第1季度结婚登记"]["北京市"]
# data.loc["北京市","2017年第1季度结婚登记"]

总结:loc和iloc函数都是用来选择某行/列的,iloc与loc的不同是:iloc是按照行/列索引所在的位置来选取数据,参数只能是整数。而loc是按照索引名称来选取数据,参数类型依索引类型而定;
1、一个数和DataFrame运算、numpy运算 都应用了广播机制 如:df+1,df中每个元素都加了1 2、DataFrame对象与ndarray对象进行运算,应用了广播机制 如:df+arr3、Series和DataFrame运算,Series 按照Series的index进行运算,所以Series的index的值要与DataFrame的columns的值一致,如果没有对齐则补齐NaN,不是广播。4、DataFrame之间可以运算,行列索引同时对齐,如果有任何一个对不齐则使用NaN填充。代码演示:一个数和DataFrame运算
df = pd.DataFrame([[1, 2, 3,4], [4, 5, 6,7], [8, 9, 10,11]], index=['row0', 'row1','row2'], columns=['col0', 'col1', 'col2','col3'])
df+1

DataFrame对象与ndarray对象运算
df = pd.DataFrame([[1, 2, 3,4], [4, 5, 6,7], [8, 9, 10,11]], index=['row0', 'row1','row2'], columns=['col0', 'col1', 'col2','col3'])
nd = np.ones(3,dtype=np.int32).reshape(-1,1)
df+nd

Series和DataFrame运算
s = pd.Series(data=[20,30,40,50],index=['col0', 'col1', 'col2','col4'])
df = pd.DataFrame([[1, 2, 3,4], [4, 5, 6,7], [8, 9, 10,11]], index=['row0', 'row1','row2'], columns=['col0', 'col1', 'col2','col3'])
df+s

DataFrame之间运算
df = pd.DataFrame([[1, 2, 3,4], [4, 5, 6,7], [8, 9, 10,11]], index=['row0', 'row1','row2'], columns=['col0', 'col1', 'col2','col3'])
df1 = pd.DataFrame([[1,1,1], [2,2,2], [3,3,3]], index=['row0', 'row1','row2'], columns=['col0', 'col1', 'col4'])
df+df1

上面仅仅是演示了加法的操作,当然也可以减法操作哦!
如果喜欢文章请点赞哦!

需要资料也可以关注微信公众号:Python专栏,事不宜迟,一起进步吧!
