跳到主要内容

Pandas 修改数据

1. 前言

通过前几节的学习,我们掌握了 Pandas 查询、新增和删除数据的操作,基本上能够进行大部分的数据处理操作,而作为数据处理中另外一个重要的内容——修改操作,Pandas 中又是如何进行的呢?

本小节我将讲述 Pandas 对数据的修改操作,包括了对索引值的修改,以及对数据值的修改操作,通过这两板块的内容,使大家能够根据自己的需要,灵活的变更数据内容。

2. 修改索引值

很多时候我们创建的数据,或者解析出来的数据,索引都是默认生成的,而我们为了方便数据的分析,需要对数据的行索引值或者列索引值进行修改,那这里 Pandas 中提供了一个函数 rename(self, mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors=‘ignore’),该函数通过灵活的参数设置,能够高效便捷的进行索引值的修改,下面我们列举了常用的几个参数说明:

参数名说明
mapper这里是要传入的映射关系,可以是个字典或者函数
index指定行索引
columns指定列索引
axis表示修改行索引(axis=0 默认)还是列索引(axis=1)
inplace是否在原数据基础上修改,默认 inplace=False 会返回一个新的数据集

2.1 修改行索引值

# 导入pandas包
import pandas as pd
# 指定导入的文件地址
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data\_source/第7,8,9,10小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)

# --- 输出结果 ---
编程语言 推出时间 价格 主要创始人
0 java 199545.6 James Gosling
1 python 199167.0 Guido van Rossum
2 C 197233.9 Dennis MacAlistair Ritchie
3 js 199559.5 Brendan Eich
4 php 201269.9 Rasmus Lerdorf
5 C++ 198375.0 Bjarne Stroustrup

# 修改行索引和 rename({0: "aa", 2: "bb", 3: "cc"},axis=0) 等价
data_res=data.rename(index={0: "aa", 2: "bb", 3: "cc"})
print(data_res)

# --- 输出结果 ---
编程语言 推出时间 价格 主要创始人
aa java 199545.6 James Gosling
1 python 199167.0 Guido van Rossum
bb C 197233.9 Dennis MacAlistair Ritchie
cc js 199559.5 Brendan Eich
4 php 201269.9 Rasmus Lerdorf
5 C++ 198375.0 Bjarne Stroustrup

输出解析:我们通过 index 参数指定映射关系,修改了列索引0,2,3的索引值为aa,bb,cc,通过输出结果可以看出修改的效果。

2.2 修改列索引值

# 导入pandas包
import pandas as pd
# 指定导入的文件地址
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data\_source/第7,8,9,10小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)

# --- 输出结果 ---
编程语言 推出时间 价格 主要创始人
0 java 199545.6 James Gosling
1 python 199167.0 Guido van Rossum
2 C 197233.9 Dennis MacAlistair Ritchie
3 js 199559.5 Brendan Eich
4 php 201269.9 Rasmus Lerdorf
5 C++ 198375.0 Bjarne Stroustrup

# 修改行索引和 rename({0: "aa", 2: "bb", 3: "cc"},axis=0) 等价
data_res=data.rename(index={0: "aa", 2: "bb", 3: "cc"})
print(data_res)

# 修改列索引和 rename({"编程语言": "bcyy", "价格": "jiage"},axis=1) 等价
data_res=data.rename(columns={"编程语言": "bcyy", "价格": "jiage"})
print(data_res)

# --- 输出结果 ---
bcyy 推出时间 jiage 主要创始人
0 java 199545.6 James Gosling
1 python 199167.0 Guido van Rossum
2 C 197233.9 Dennis MacAlistair Ritchie
3 js 199559.5 Brendan Eich
4 php 201269.9 Rasmus Lerdorf
5 C++ 198375.0 Bjarne Stroustrup

输出解析:我们这里通过 columns 指定了映射关系,将列索引值编程语言和价格分别修改为 bcyy 和 jiage ,通过输出结果可以看到修改的效果。

当然如果我们同时设置 index 和 columns 的映射关系,则会同时修改对应的索引值:

# 修改列索引和 rename({"编程语言": "bcyy", "价格": "jiage"},axis=1) 等价
data_res=data.rename(index={0: "aa", 2: "bb", 3: "cc"},columns={"编程语言": "bcyy", "价格": "jiage"})
print(data_res)

# --- 输出结果 ---
bcyy 推出时间 jiage 主要创始人
aa java 199545.6 James Gosling
1 python 199167.0 Guido van Rossum
bb C 197233.9 Dennis MacAlistair Ritchie
cc js 199559.5 Brendan Eich
4 php 201269.9 Rasmus Lerdorf
5 C++ 198375.0 Bjarne Stroustrup

3. 修改数据值

3.1 修改单个数据值

修改单个数据值,是通过查询函数获取到某个数据,然后修改这个数据的内容,可以用函数 at[]、iat[]、loc[]、iloc[],但要注意不同的函数所传递参数的不同,下面我们列举这四个函数的不同之处:

函数说明
loc[]只能使用标签索引,不能使用整数索引,通过标签索引切边进行筛选时
iloc[]只能使用整数索引,不能使用标签索引,通过整数索引切边进行筛选时
at[]只能使用标签索引,使用时必须输入两个参数,即行索引和列索引
iat[]只能使用整数索引,使用时必须输入两个参数,即行索引和列索引

虽然四种函数都能获取单个数据值,进而进行修改,但从运行速度上四种方法从高到底分别为: iat[]、at[]、iloc[]、loc[],这里我们选择 iat[] 演示对单个数据值的修改操作:

# 导入pandas包
import pandas as pd
# 指定导入的文件地址
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data\_source/第7,8,9,10小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)

# --- 输出结果 ---
编程语言 推出时间 价格 主要创始人
0 java 199545.6 James Gosling
1 python 199167.0 Guido van Rossum
2 C 197233.9 Dennis MacAlistair Ritchie
3 js 199559.5 Brendan Eich
4 php 201269.9 Rasmus Lerdorf
5 C++ 198375.0 Bjarne Stroustrup

# 这里我们对 第2行,第3列进行数据修改
data.iat[1,2]=3432
print(data)

# --- 输出结果 ---
编程语言 推出时间 价格 主要创始人
0 java 199545.6 James Gosling
1 python 19913432.0 Guido van Rossum
2 C 197233.9 Dennis MacAlistair Ritchie
3 js 199559.5 Brendan Eich
4 php 201269.9 Rasmus Lerdorf
5 C++ 198375.0 Bjarne Stroustrup

输出解析:我们通过 iat[] 对第2行,第3列数据进行修改,通过输出结果可看到原数据值为67.0,这里被修改3432.0

3.2 修改某类数据值

有时候我们需要对数据集中的一类数据进行修改,比如我们要将所有的“1995年”换成字符串“2000年”,这时我们就需要用到函数 replace(to_replace=None,value=None……),该函数的两个核心参数 to_replace 表示要被替换的数据,value 是替换后的数据,该函数修改后,会返回新的数据集,不会影响到原数据。

# 导入pandas包
import pandas as pd
# 指定导入的文件地址
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data\_source/第7,8,9,10小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)

# --- 输出结果 ---
编程语言 推出时间 价格 主要创始人
0 java 199545.6 James Gosling
1 python 199167.0 Guido van Rossum
2 C 197233.9 Dennis MacAlistair Ritchie
3 js 199559.5 Brendan Eich
4 php 201269.9 Rasmus Lerdorf
5 C++ 198375.0 Bjarne Stroustrup

# 这里我们对 将所有的“1995年”数据修改为“2000年”
new_data=data.replace("1995年","2000年")
print(new_data)

# --- 输出结果 ---
编程语言 推出时间 价格 主要创始人
0 java 200045.6 James Gosling
1 python 199167.0 Guido van Rossum
2 C 197233.9 Dennis MacAlistair Ritchie
3 js 200059.5 Brendan Eich
4 php 201269.9 Rasmus Lerdorf
5 C++ 198375.0 Bjarne Stroustrup

输出解析:这里可以看到原数据中所有的“1995年”都被改成了“2000年”。这里我们要被修改的值也可以传入列表的形式,指定多个被修改的数据值,如下面代码所示:

# 这里我们传入list数据集,对这几个数据进行修改为“2000年”
new_data=data.replace(["1995年","2012年","1983年"],"2000年")
print(new_data)

# --- 输出结果 ---
编程语言 推出时间 价格 主要创始人
0 java 200045.6 James Gosling
1 python 199167.0 Guido van Rossum
2 C 197233.9 Dennis MacAlistair Ritchie
3 js 200059.5 Brendan Eich
4 php 200069.9 Rasmus Lerdorf
5 C++ 200075.0 Bjarne Stroustrup

输出解析:通过输出结果可以看到,原数据集中的1995年,2012年,1983年都被修改为了“2000年”。

3.2 修改某区域数据值

我们还可以对某些行或列的数据进行统一的修改操作,这里我们可以使用函数 loc() 或 iloc() ,只是要注意传入的参数不同。下面我们使用 iloc() 修改整行或整列的数据操作:

# 导入pandas包
import pandas as pd
# 指定导入的文件地址
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data\_source/第7,8,9,10小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)

# --- 输出结果 ---
编程语言 推出时间 价格 主要创始人
0 java 199545.6 James Gosling
1 python 199167.0 Guido van Rossum
2 C 197233.9 Dennis MacAlistair Ritchie
3 js 199559.5 Brendan Eich
4 php 201269.9 Rasmus Lerdorf
5 C++ 198375.0 Bjarne Stroustrup

# 这里我们创建了一个新的数据集
data_new= pd.DataFrame([["11","22","33.5","44"], ["55","66","77.7","88"]],
columns=["编程语言","推出时间","价格","主要创始人"])
data.iloc[[0,1]]=data_new
print(data)

# --- 输出结果 ---
编程语言 推出时间 价格 主要创始人
0 11 22 33.5 44
1 55 66 77.7 88
2 C 197233.9 Dennis MacAlistair Ritchie
3 js 199559.5 Brendan Eich
4 php 201269.9 Rasmus Lerdorf
5 C++ 198375 Bjarne Stroustrup

输出解析:我们创建了一个新的数据集,用来替换原数据第1行和第2行的数据,通过输出结果可以看到被修改后的数据集。

下面我们来修改一整列的数据:

# 创建了一个Series对象
new_series=pd.Series(["11","22","3","44","55","66"] )
data.iloc[:,[1]]=new_series
print(data)

# --- 输出结果 ---
编程语言 推出时间 价格 主要创始人
0 java 11 45.6 James Gosling
1 python 22 67.0 Guido van Rossum
2 C 3 33.9 Dennis MacAlistair Ritchie
3 js 44 59.5 Brendan Eich
4 php 55 69.9 Rasmus Lerdorf
5 C++ 66 75.0 Bjarne Stroustrup

输出解析:这里我们新建一个 Series 对象用来替换第二列的数据值,通过输出结果可以看到为我们第二列的数据值被修改的结果。

4.小结

本节课我们主要学习了如何修改数据集中的索引和数据值,并详细介绍了对行索引和列索引的修改,细化了数据值修改的几种方式,包括单个数据值的修改,一类数据的修改和某个区域的数据修改。本节课程的重点如下:

  • 修改索引值 rename() 函数的使用;
  • 修改数据使用 iat[] 函数,replace() 函数 ,iloc() 函数操作的方法。

图片描述