【数据分析---Pandas实战指南:精通数据查询、增删改操作与高效索引和列名操作管理】

前言:
💞💞大家好,我是书生♡,本阶段和大家一起分享和探索数据分析,本篇文章主要讲述了:数据查询操作,数据增删改操作,索引和列名操作等等。欢迎大家一起探索讨论!!!
💞💞代码是你的画笔,创新是你的画布,用它们绘出属于你的精彩世界,不断挑战,无限可能!

个人主页⭐: 书生♡
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',
            ...
        }   )   ```
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值