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() 函数操作的方法。

图片描述

Tips:想要学习更多Pandas相关知识,可以点击
Pandas 新增数据
Pandas 删除数据
Pandas 查询数据