前言:
💞💞大家好,我是书生♡,本阶段和大家一起分享和探索数据分析,本篇文章主要讲述了:数据查询操作,数据增删改操作,索引和列名操作等等。欢迎大家一起探索讨论!!!
💞💞代码是你的画笔,创新是你的画布,用它们绘出属于你的精彩世界,不断挑战,无限可能!
个人主页⭐: 书生♡
gitee主页🙋♂:闲客
专栏主页💞:大数据开发
博客领域💥:大数据开发,java编程,前端,算法,Python
写作风格💞:超前知识点,干货,思路讲解,通俗易懂
支持博主💖:关注⭐,点赞、收藏⭐、留言💬
目录
1. Pandas数据查询操作
1.1 基本查询方法
准备数据:从文件中读取数据,使用read_csv方法
# 导入模块 import pandas as pd import numpy as np # 加载链家租房数据 df = pd.read_csv('data/LJdata.csv')
1.1.1 从前从后查询—head和tail
- 从前面查询使用-----》
head(n)
- 从后面查询使用-----》
tail(n)
- n是我们查询的行数,默认是5行
# 前3条数据 print(df.head(n=3)) # 后3条数据 df.tail(n=3)
1.1.2 查询一/多列数据— 对象名[列名]
- 获取一列数据
df[列名] / df.列名
-> 列名不能有空格/不能和属性名重名
# 获取一列数据 print(df['id'].head(n=5)) print(df.name.head(n=5))
- 获取多列数据
获取多列数据 select 列名1, 列名2, … from 表名
df[[列名1, 列名2, ...]]
# 获取多列数据 df[['name', 'age']].head(n=3)
1.1.3 布尔值向量查询多行数据
- 通过布尔值向量获取多行数据
# 通过布尔值向量获取多行数据 df_head = df.head() df_head
- 布尔值s对象获取多行数据
注意:
df[‘age’] == df[‘age’].max()
这个表达式返回一个Series,其中包含布尔值(True 或
False),表示DataFrame中每一行的’age’列是否等于’age’列的最大值。 返回类型:
返回的是一个布尔Series,长度与原始DataFrame相同,每个元素表示对应行的’age’值是否为最大。
df[df[‘age’]==df[‘age’].max()]
描述: 这个表达式使用前面得到的布尔Series作为索引来筛选DataFrame,只保留那些满足条件(即’age’等于最大值)的行。
返回类型: 返回的是一个新的DataFrame,只包含那些’age’列值等于最大值的行。
# 布尔值s对象获取多行数据 print(df['age'] == df['age'].max()) df[df['age']==df['age'].max()]
- 布尔值列表获取多行数据
# 布尔值列表的个数要和df数据的行数一致 # 布尔值列表获取多行数据 list1 = [True, False, True, False, False, False, True, False, True, False, False, False, True, False, True, False,False] df[list1]
- 布尔值数组获取多行数据
# 布尔值数组获取多行数据 n1 = np.array([True, False, True, False, False, False, True, False, True, False, False, False, True, False, True, False,False]) df[n1]
1.1.4 行下标切片查询多行数据—对象名[起始下标值:结束下标值:步长]
通过行下标切片获取多行数据, 语法等同于python容器索引切片
行下标从上到下从0开始, 从下到上从-1开始df[起始下标值:结束下标值:步长]
左闭右开原则
-> 包含起始下标对应的行数据, 不包含结束下标对应的行数据
起始下标为0, 可以省略不写
结束下标不写, 获取最后一行数据
步长不写默认为1, 可以修改; 可以为负数, 倒序查询
数据准备
# 获取准备的数据 df_head = df.head(n=10) df_head # 取前十条数据
# 查询前五条数据 temp_df = df_head[0:5] temp1_df = df[:5] # 起始下标值为0可以不写 temp2_df = df[3:] # 结束下标不写, 获取最后一行数据 temp3_df = df[::] # 全部省略,获取全部数据 temp4_df = df[::-1] # 倒序查询全部数据 temp5_df = df[::2] # 步长为2,查看奇数列,即id为1、3、5、7、9 temp6_df = df[::-2] # 步长为-2,查看偶数列,即id为2、4、6、8、10 temp7_df = df[9:6:-1] temp7_df
1.2 loc查询行列数据
行索引值/列名:肉眼看到的值, 可以是任意值, 可以重复
df.loc[行索引名, 列名]
- 索引/列下标: 从0开始, 或从-1开始 ,是看不见的
- 索引名/列名: 肉眼看到的值, 可以是任意值, 可以有重复的值
- 通过行索引名
# 获取行数据 # df.loc[[行索引名1, 行索引名2, ...]] # 获取一行数据 print(df.loc[0]) # 返回Series对象 print(df.loc[[0]]) # 返回df对象 df.loc[[0, 1, 2]] # 返回df对象
- 行索引值切片获取多行数据
df.loc[起始索引值:结束索引值:步长]
—左闭右闭
# 行索引值切片获取多行数据 # df.loc[起始索引值:结束索引值:步长] # 左闭右闭原则 print(df.loc[0:5:1]) # df[0:5:1] # 取到第五行 print(df.loc[2::]) # print(df.loc[2:8:2]) # 步长为2,查看奇数列,即索引2,4,6,8 print(df.loc[::-1]) # 倒序查询全部数据 print(df.loc[9:6:-1]) # 倒序返回 9-6 的数据
- 布尔值向量获取多行数据
df.loc[布尔值向量]
# 布尔值向量获取多行数据 # df.loc[布尔值向量] df.loc[df['age']==df['age'].max(), ['name', 'age']]
- 布尔值向量取行配合列名取子集
布尔值向量取行配合列名取子集,一个列名可以不加【】,但是多个列名必须加【】df.loc[布尔值向量, [列名1, 列名2, ....]]
# 布尔值向量取行配合列名取子集,一个列名可以不加【】,但是多个列名必须加【】 # df.loc[布尔值向量, [列名1, 列名2, ....]] df.loc[df['age']>25, ['name', 'age']]
- 行索引名取行配合列名取子集
df.loc[[行索引名1, 行索引名2, ...], [列名1, 列名2, ...]]
# 行索引名取行配合列名取子集 # df.loc[[行索引名1, 行索引名2, ...], [列名1, 列名2, ...]] df.loc[[0, 1, 2, 3, 4], ['id', 'name', 'age']]
- 行索引值切片配合列名取子集
df.loc[起始索引值:结束索引值:步长, [列名1, 列名2, ...]]
# 行索引值切片配合列名取子集,左闭右闭规则 # df.loc[起始索引值:结束索引值:步长, [列名1, 列名2, ...]] df.loc[0:4:1, ['id', 'name', 'age']]
- 行索引值切片取行配合列名切片取子集,左闭右闭规则
df.loc[起始索引值:结束索引值:步长, 起始列名:结束列名:步长]
# 行索引值切片取行配合列名切片取子集 # df.loc[起始索引值:结束索引值:步长, 起始列名:结束列名:步长] df.loc[0:4:1, 'id':'age':1]
1.3 iloc查询行列数据
iloc -> index location
df.iloc[行索引下标, 列名下标]
下标: 从0开始或从-1开始
- 获取行数据
df.iloc[行索引下标1,行索引下标2,...]
获取一行数据
# 获取行数据 # df.iloc[行索引下标1,行索引下标2,...] # 获取一行数据 print(df.iloc[0]) # 返回Series对象 print(df.iloc[[0]]) # 返回df对象
获取多行数据
# 获取多行数据 print(df.iloc[[0,2,4,6,8]]) print(df.iloc[[-1,-2,-3,-4]])
- 行索引下标切片获取多行数据 下标值,是左闭右开
df[起始下标值:结束下标值:步长]
# 行下标切片获取多行数据 # df.iloc[起始下标值:结束下标值:步长] # 等同于df[起始下标值:结束下标值:步长] # 查询前五条数据 iloc0_df = df_head.iloc[0:5] iloc1_df = df.iloc[:5] # 起始下标值为0可以不写 iloc2_df = df.iloc[3:] # 结束下标不写, 获取最后一行数据 iloc3_df = df.iloc[::] # 全部省略,获取全部数据 iloc4_df = df.iloc[::-1] # 倒序查询全部数据 iloc5_df = df.iloc[::2] # 步长为2,查看奇数列,即id为1、3、5、7、9 iloc6_df = df.iloc[::-2] # 步长为-2,查看偶数列,即id为2、4、6、8 iloc7_df = df.iloc[9:6:-1] iloc7_df
- 行列下标切片获取子集
df.iloc[行下标切片, 列下标切片]
# 行列下标切片获取子集 # df.iloc[行下标切片, 列下标切片] df.iloc[::2, ::2]
- 行下标切片配合列下标获取子集
一个列下标可以不加【】,但是多个列下标必须加【】df.iloc[行下标切片, [列下标, 列下标, ....]]
# 行下标切片取行配合列下标取子集,一个列下标可以不加【】,但是多个列下标必须加【】 # df.iloc[行下标切片, [列下标, 列下标, ....]] iloc0_df = df.iloc[0:7:2,[0,1,2]] iloc0_df
- 行下标配合列下标获取子集
df.iloc[[行下标, 行下标, ....], [列下标, 列下标, ....]]
# 行下标取行配合列下标取子集 # df.iloc[[行下标, 行下标, ....], [列下标, 列下标, ....]] iloc0_df = df.iloc[[0,2,4,6,8], [0,1,2]] iloc0_df
- 行下标配合列下标切片获取子集
df.iloc[起始下标值:结束下标值:步长, 起始列下标:结束列下标:步长]
# 行下标切片配合列下标切片取子集 # df.iloc[起始下标值:结束下标值:步长, 起始列下标:结束列下标:步长] iloc_df = df.iloc[0:4:1, 0:3:1] iloc_df
1.4 loc和iloc的区别
- loc(location)是通过行索引值或列名获取数据,
- iloc(index location)是通过行下标或列下标获取数据
- 索引值: 肉眼看到的值, 可以是任意值, 可以重复
- 下标: 从0开始或从-1开始,看不见的值
- 一般建议使用loc获取行列数据(调整行列顺序, 不会影响查询结果)
1.5 query方法
准备数据:
df = pd.read_csv('data/LJdata.csv').head(10) df
表达式:
df.query(expr)
注意:
- 列名不需要加引号, 数据值为字符串类型需要加引用
单个条件查询
# df.query(expr) # 通过expr表达式(字符串类型)获取条件为True的数据 print(df.query('面积>80')) # 列名不需要加引号, 数据值为字符串类型需要加引用 print(df.query('朝向=="南"'))
多个条件查询
query方法还可以使用in关键字,可以使用&或and |或or
# query方法还可以使用in关键字,可以使用&或and |或or, df.query('区域 in ["望京租房","天通苑租房","回龙观租房"] and 朝向 in ["东" ,"南"]')
1.6 where 方法
where() 方法 保留满足条件的数据,不满足条件的数据用nan填充
我们也可以做指定 other参数来填充nan ,也可以使用dropna方法删除不满足条件的
# where() 方法 保留满足条件的数据,不满足条件的数据用nan填充 # 我们也可以做指定 other参数来填充nan ,也可以使用dropna方法删除不满足条件的 print(df.where(df['朝向'] == "南")) df.where(df['朝向']=="南",other=" ") # 不满足条件的填充为空格
不满足的直接删除,使用dropna方法
df.where(df['朝向']=="南").dropna()
1.7 isin 方法获取子集
df/s.isin(values=[])
判断df或s对象的值是否在values列表中, 返回True或Fasle
使用场景: 判断df中某列(s对象)的值是否在values列表中
# df/s.isin(values=[]) # 判断df或s对象的值是否在values列表中, 返回True或Fasle print(df.isin(values=['2室1厅', '南'])) # 使用场景: 判断df中某列(s对象)的值是否在values列表中 df[df['户型'].isin(values=['2室1厅']) & df['朝向'].isin(values=['南'])]
1.8 方法小结(重点)
方法说明 | 子集操作方法 |
---|---|
获取前n行数据,默认5行 | df.head(n) |
获取最后n行数据,默认5行 | df.tail(n) |
获取一列数据 | df[列名] 或 df.列名 |
获取多列数据 | df[[列名1,列名2,...]] |
df[[True, False, …]]取出对应为True的数据行 | df[[布尔值向量]] |
行下标(索引下标)切片获取数据行 | df[起始行下标:结束行下标:步长] |
索引值(行名)获取1行数据 | df.loc[行索引值] |
索引值(行名)获取多行数据 | df.loc[[行索引值1, 行索引值2, ...]] |
索引值(行名)切片获取多行数据,注意与df[起始行下标:结束行下标:步长]不同 | df.loc[起始行索引值:结束行索引值:步长] |
布尔值向量获取行数据,等同于df[[布尔值向量]] | df.loc[[布尔值向量]] |
布尔值向量取行再配合列名取子集 | df.loc[布尔值向量,[列名1, 列名2, ...]] |
索引值取行再配合列名取子集 | df.loc[[行索引值1, 行索引值2, ...], [列名1, 列名2, ...]] |
列名取子集 | df.loc[行索引值起始值:行索引值结束值:步长, [列名1, 列名2, ...]] |
行下标取1行 | df.iloc[行下标] |
行下标取多行 | df.iloc[[行下标1, 行下标2, ...]] |
行下标切片取多行 | df.iloc[起始行下标:结束行下标:步长] |
行列下标切片取子集 | df.iloc[起始行下标:结束行下标:步长,起始列下标:结束列下标:步长] |
行下标切片和列下标取子集 | df.iloc[起始行下标:结束行下标:步长,[列下标1, 列下标2, ...]] |
行下标和列下标取子集 | df.iloc[[行下标1, 行下标2, ...], [列下标1, 列下标2, ...]] |
行下标和列下标切片取子集 | df.iloc[[行下标1, 行下标2, ...], 起始列下标:结束列下标:步长] |
依据判断表达式返回符合条件的df子集 | df.query('判断表达式字符串') 与 df[[布尔值向量]] 效果相同 |
判断是否存在某个值 | df.isin([值1, 值2, ...]) |
2. Pandas数据增删改操作
数据准备:
# 加载数据 df = pd.read_csv('data/LJdata.csv').head(10) df
2.1 增加列
2.1.1 末尾增加列
df[列名]= 常数/s对象/list对象/数组对象
数值个数必须与df行数一致
## 末尾增加一列数据 #df[列名]= 常数/s对象/list对象/数组对象 # 注意点:数值个数必须与df行数一致 temp_df = df.head(5).copy() temp_df
- 常数
df[列名]= 常数
# 常数 temp_df['省份'] = '北京' temp_df
- s 对象
df[列名]= s对象
# s 对象 print(temp_df['价格']+500) temp_df['新价格'] = temp_df['价格']+500 temp_df
- list 对象
df[列名]=list对象
# list 对象 # 添加区县列,# 增加区县列, 列值 ['朝阳区', '朝阳区', '西城区', '昌平区', '朝阳区'] # 数据值个数要和df行数据一致 temp_df['区县'] = ['朝阳区', '朝阳区', '西城区', '昌平区', '朝阳区'] temp_df
2.1.2 insert方法指定位置增加列数据
df指定位置添加列数据
df.insert(loc=, column=, value=)
loc: 列下标值, 只能使用正数 0,1,2,…
column: 列名
value: 列值, 常数/s对象/list对象/数组对象\
为了避免对原始数据进行修改,先将数据复制一份
new_df = df.head(5).copy() new_df
- 常数
# 在区域前面加上一列常数数据, 列名为省份,值为北京 new_df.insert(loc=0,column='省份',value='北京') new_df
- S对象
#%% # 添加一个s对象,添加一个新的价格 ,值为价格+500 new_df.insert(loc=6,column='新价格',value=df['价格']+500) new_df
- list列表
# list 对象 # 添加区县列,# 增加区县列, 列值 ['朝阳区', '朝阳区', '西城区', '昌平区', '朝阳区'] # 数据值个数要和df行数据一致 new_df.insert(loc=1,column="区县",value=['朝阳区', '朝阳区', '西城区', '昌平区', '朝阳区']) new_df
2.2 DataFrame删除行列
df.drop(labels=, axis=, inplace=)
labels: 根据行索引值或列名删除, 可以删除多行多列 -> 列表
axis: 0或index -> 删除行数据, 默认 1或columns -> 删除列数据
inplace: True->原df上删除 False->不在原df上删除, 默认False
- 删除一行数据
根据labels的行索引值
# 删除一行数据 drop_df = temp_df.drop(0) drop_df
- 删除多行数据
行索引值 使用【】包起来,axis为0,表示删除行
# 删除多行数据 drop1_df = temp_df.drop([0,1],axis=0) drop1_df
- 删除一列数据
指定被删除的列索引值(列名),axis为1 ,表示删除列
# 删除一列数据 drop2_df = temp_df.drop(labels='价格',axis=1) drop2_df
- 删除多列信息
行索引值(列名) 使用【】包起来,axis为1 ,表示删除列
# 删除多列信息 drop4_df= temp_df.drop(labels=['省份','新价格'],axis=1) drop4_df
- 删除在原始数据删除数据
指定 inplace=True 就可以删除原始数据,默认为False不删除
#%% # 删除在原始数据删除数据 temp_df.drop(labels=['地址'],axis=1,inplace=True) temp_df
2.3 数据去重
2.3.1 drop_duplicates()
df/s.drop_duplicates(subset=, keep=, inplace=)
subset: 列名列表, 根据指定的列进行去重(distinct 列名1, 列名2); 不写的话需要根据所有列进行去重(distinct *)
keep: 保留哪条重复的行数据 first:第一条(默认) last:最后一条 False:全部删除
inplace: 是否在原数据上删除
- 全部去重,直接使用drop_duplicates(),不指定任何参数
# 全部数据去重 temp_df.drop_duplicates()
- 根据指定列去重,默认保留第一条
# 根据指定列去重,默认保留第一条 temp_df.drop_duplicates(subset=['户型'])
- 根据指定列去重,保留最后一条
keep的参数可以指定first和last first为第一条数据,last为最后一条数据
# 根据指定多列去重,保留最后一条 temp_df.drop_duplicates(subset=['户型','朝向'],keep='last')
- 删除重复数据 ,keep 的参数设置为False
# 删除重复数据 temp_df.drop_duplicates(subset=['户型','朝向'],keep=False)
- 在原数据进行去重删除
将inplace=True ,默认为false不删除
# 在原数据进行去重删除 (new_df.drop_duplicates(subset=['户型','朝向'],keep='first',inplace=True)) new_df
2.3.2 unique 去重
准备数据:测试使用只取一列数据
s1 = temp_df.head().copy()['朝向'] print(s1)
使用drop_duplicates() 但回的是列数据
unique() 返回的是一个数组
在这里插入代码片
s1.unique() # 返回的是一个数组 s1.nunique() # 返回唯一值的个数,去重计数
2.4 Series 和 DataFrame 修改数据
2.4.1 直接修改数据
直接修改数据
df[列名] = 新值 s[下标] = 新值
新值: 常数/s对象/list对象/数组对象
- 常数
df[列名] = 常数
# 常数 temp_df['户型']='3室2厅' temp_df
- s对象
# s对象 # 将面积增加10,在保存在面积列中 temp_df['面积']=temp_df['面积']+10 temp_df
- list对象
直接将一列数据改为列表中的数据,注意个数要一致
# list对象 temp_df['朝向']=['东','南','西','北','南'] temp_df
- 数组对象
直接将一列数据改为数组中的数据,注意个数要一致
# 数组对象 temp_df['价格']=np.arange(0,5) temp_df
2.4.2 replace 替换数据
replace方法替换数据
df.replace(to_replace=, value=, inplace=)
to_replace: 旧值
value: 新值
inplace: 是否在原数据上修改
- 替换一个值
df.replace(to_replace=, value=)
# 替换一个值 temp_df.replace(to_replace=['3室2厅'],value='3室1厅')
- 替换多个值
必须用【】括起来
# 替换多个值 temp_df.replace(to_replace=['东','南'],value='中')
- 使用字典替换,哪一列的哪些值
df.replace(to_replace={'列名': 值, '列名': 值}, value=新值)
print(temp_df.replace(to_replace={'价格': 0, '面积': 60}, value=8888)) temp_df.replace(to_replace={'价格': {0: 888, 1: 999, 2: 777, 3: 666, 4: 555}})
2.4.3 apply调用自定义函数修改
s对象或df对象如何执行自定函数? -> 借助apply方法
s/df.apply(func=,axis=,args=)
func: 自定义函数名
axis: df中按行(1)或按列(0,默认的)执行
args: 自定义函数带其他有参数时, 需要通args传参
- s对象的apply方法
s对象的apply方法
自定义函数中的第一个参数值是s对象的每一个值
自定义函数返回值为一个值
apply_df = df.head(10).copy() apply_df def func1(x): if x=='天通苑租房': return '好地方' else: return '不好地方' apply_df['区域']=apply_df['区域'].apply(func=func1) apply_df
如果自定义函数中有其他的参数, 需要通过args=()传递参数值
# 定义函数 def func2(x, arg1, arg2): if x == "不好地方": return arg1 elif x == "好地方": return arg2 else: return x # 如果自定义函数中有其他的参数, 需要通过args=()传递参数值 apply_df['区域'].apply(func=func2, args=('昌平租房', '朝阳租房')) # 如果自定义函数中有其他的参数, 可以通过 参数名=参数值 形式传递参数值 apply_df['区域'].apply(func=func2, arg1='昌平11租房', arg2='朝阳11租房')
- df对象的apply方法
#df对象的apply方法
#自定义函数中的第一个参数值是s对象(df中的一行或一列)
#自定义函数返回值是s对象
s._name是判断是否有列名等于值,有的话就进行判断。
默认是按列执行 args=(‘新值’,) 【逗号不能省略】
df_apply_df = df.head().copy() df_apply_df def func4(s, arg1): # print(f"s的值是:{s}") # print(f"s的类型是:{type(s)}") # print(s.__dict__) # print(s._name) # 查看s对象的name属性值 if s._name == "区域": # s.replace(to_replace=['燕莎租房'], value=arg1) return s.replace(to_replace=['燕莎租房'], value=arg1) return s # 默认是按列执行 ,axis=0 ,(可以不写) df_apply_df.apply(func=func4,args=('朝阳租房',))
按行执行----》axis=1
如果区域这一列中,某一行的值等于设的值,那么就将参数的值赋值给这一行的数据
# 按行执行 axis=1 def func5(s, arg1): # print(f"s的值是:{s}") # print(f"s的类型是:{type(s)}") # print(s['区域']) if s['区域'] == '天通苑租房': s['区域'] = arg1 return s return s # 按行执行 axis=1 temp_df.apply(func=func5, axis=1, args=('昌平租房',)) # 使用自定义函数处理df中某列数据时, df[列名].apply(func=自定义函数名) # 使用自定义函数处理df中每行数据时, df.apply(func=自定义函数名, axis=1)
- 使用自定义函数处理df中某列数据时, df[列名].apply(func=自定义函数名)
- 使用自定义函数处理df中每行数据时,df.apply(func=自定义函数名, axis=1)
2.4.4 applymap方法
df对象的applymap方法是将df对象中的每一个值,都进行筛选判断,符合就修改,不需要指定列或者行
# df对象的applymap方法 # df.applymap(func=) # 将df对象中的每个值放到自定义函数中执行 def func7(x): # print(f"x的值是:{x}") if x == "2室1厅": return '3室1厅' return x df_apply_df.applymap(func=func7)
2.5 小结(重点)
df['列名'] = 标量或向量
修改或添加列df.insert(列下标数字, 列名, 该列所有值)
指定位置添加列<df/s>.drop([索引值1, 索引值2, ...])
根据索引删除行数据df.drop([列名1, 列名2, ...], axis=1)
根据列名删除列数据<df/s>.drop_duplicates()
df或s对象去除重复的行数据s.unique()
s对象去除重复的数据<df/s>.replace('原数据', '新数据', inplace=True)
替换数据- df或series对象替换数据,返回的还是原来相同类型的对象,不会对原来的df造成修改
- 如果加上inplace=True参数,则会修改原始df
apply
函数s.apply(自定义函数名, arg1=xx, ...)
对s对象中的每一个值,都执行自定义函数,且该自定义函数除了固定接收每一个值作为第一参数以外,还可以接收其他自定义参数df.apply(自定义函数名, arg1=xx, ...)
对df对象中的每一列,都执行自定义函数,且该自定义函数除了固定接收列对象作为第一参数以外,还可以接收其他自定义参数df.apply(自定义函数名, arg1=xx, ..., axis=1)
对df对象中的每一行,都执行自定义函数,且该自定义函数除了固定接收行对象作为第一参数以外,还可以接收其他自定义参数applymap
函数df.applymap(自定义函数名)
对df对象中的每个值, 都执行自定义函数, 且该自定义函数只能接收每个值作为参数, 不能接收其他自定义参数
3. DataFrame获取索引和列名
加载数据:
import pandas as pd # 加载数据集合 df = pd.read_csv('data/LJdata.csv') print(df.head()) # 获取天通院租房的数据 test_df = df[df['区域']=='天通苑租房'] print(test_df.head()) # 获取上面的价格列 price_df = test_df['价格'] price_df.head()
3.1 获取索引和列名
3.1.1 获取DF对象的索引和列名
获取索引:index【下标】
获取列名:columns【下标】或者 keys()
- 获取索引
# 获取索引 print(test_df.index) # 获取某一个索引,类似于列表 print(test_df.index[0]) print(test_df.index[-1])
- 获取列名
# 获取列名,返回一个列表 print(test_df.columns) # 获取某一个列名 print(test_df.columns[0]) # 获取列名,返回一个列表 print(test_df.keys())
3.1.2 获取S对象的索引和列名
Series只有索引值没有列名
获取索引:index【下标】
# 获取series的索引 print(price_df.index) # 获取某一个索引,类似于列表 print(price_df.index[-1]) # 获取列名,返回一个列表 print(price_df.keys())
3.2 修改索引和列名
3.2.1 指定列作为索引
df.set_index(keys=[列名1, 列名2, ...], drop=, inplace=)
keys:指定某列/某些列作为df索引
drop:是否删除指定列, 默认True
inplace:是否修改原数据, 默认False
- 指定一列作为索引
print(test_df.set_index(keys=['区域'], drop=True, inplace=False).head(3)) test_df.set_index(keys=['区域'], drop=False, inplace=False).head(3)
- 指定多列作为索引
# 指定多列作为索引 test_df.set_index(keys=['区域', '地址']).head(3)
test_df.set_index(keys=['区域', '地址']).index
- 加载数据的时候指定索引
读取数据的时候,加上一个参数index_col=[‘列名’ / 列下标]
# 加载数据的时候指定索引 print(pd.read_csv('data/LJdata.csv', index_col=["区域"]).head(5)) pd.read_csv('data/LJdata.csv', index_col=[0,1]).head(5)
3.2.2 重置索引
重置索引:df/s.reset_index(drop=, inplace=)
drop: 是否删除原索引, 默认False
inplace: 是否修改原数据, 默认False
- DF对象重置索引
设置索引:
test_df= test_df.head(5) test_df.set_index(keys=['区域'],inplace=True)
重置索引
# 重置 test_df.reset_index()
查看索引
test_df.reset_index()
删除原始索引
test_df.reset_index(drop=True)
- S对象重置索引
重置索引
price_df.reset_index()
S对象重置索引后删除原索引
print(type(price_df.reset_index(drop=True))) price_df.reset_index(drop=True)
3.2.3 赋值修改
赋值修改索引和列名
df.index = 新值 df.columns = 新值
修改df中所有的索引和列名
# # 新值个数要和行数据一致 temp_df.index = ['a', 'b', 'c', 'd', 'e'] temp_df temp_df.columns = ['区域11', '地址11'] temp_df
3.2.4 rename方法修改索引和列名
df.rename(index={}, columns={}, inplace=)
{原值:新值}
可以修改指定的索引和列名
查看数据
temp_df
temp_df.rename(index={'a':'A'}, columns={'区域11':'区域'})
3.3 小结(重点)
查看或修改索引
<s/df>.index
查看或修改列名
df.columns=[col_name1, col_name2, ...]
读取数据时指定某列为索引
pd.read_csv('csv_path', index_col=[列名])
设置某列为df的索引
df.set_index(列名)
重置df的索引为默认自增索引
df.reset_index(drop=)
指定修改部分索引值或列名
'原索引名1': '新索引名1', '原索引名2': '新索引名2', ... }, columns={ '原列名a': '新列名a', '原列名b': '新列名b', ... } ) ```