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 1995年 45.6 James Gosling
1 python 1991年 67.0 Guido van Rossum
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js 1995年 59.5 Brendan Eich
4 php 2012年 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python 1991年 67.0 Guido van Rossum
bb C 1972年 33.9 Dennis MacAlistair Ritchie
cc js 1995年 59.5 Brendan Eich
4 php 2012年 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python 1991年 67.0 Guido van Rossum
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js 1995年 59.5 Brendan Eich
4 php 2012年 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python 1991年 67.0 Guido van Rossum
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js 1995年 59.5 Brendan Eich
4 php 2012年 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python 1991年 67.0 Guido van Rossum
bb C 1972年 33.9 Dennis MacAlistair Ritchie
cc js 1995年 59.5 Brendan Eich
4 php 2012年 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python 1991年 67.0 Guido van Rossum
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js 1995年 59.5 Brendan Eich
4 php 2012年 69.9 Rasmus Lerdorf
5 C++ 1983年 75.0 Bjarne Stroustrup
# 這里我們對 第2行,第3列進行數據修改
data.iat[1,2]=3432
print(data)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創始人
0 java 1995年 45.6 James Gosling
1 python 1991年 3432.0 Guido van Rossum
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js 1995年 59.5 Brendan Eich
4 php 2012年 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python 1991年 67.0 Guido van Rossum
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js 1995年 59.5 Brendan Eich
4 php 2012年 69.9 Rasmus Lerdorf
5 C++ 1983年 75.0 Bjarne Stroustrup
# 這里我們對 將所有的“1995年”數據修改為“2000年”
new_data=data.replace("1995年","2000年")
print(new_data)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創始人
0 java 2000年 45.6 James Gosling
1 python 1991年 67.0 Guido van Rossum
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js 2000年 59.5 Brendan Eich
4 php 2012年 69.9 Rasmus Lerdorf
5 C++ 1983年 75.0 Bjarne Stroustrup
輸出解析:這里可以看到原數據中所有的“1995年”都被改成了“2000年”。這里我們要被修改的值也可以傳入列表的形式,指定多個被修改的數據值,如下面代碼所示:
# 這里我們傳入list數據集,對這幾個數據進行修改為“2000年”
new_data=data.replace(["1995年","2012年","1983年"],"2000年")
print(new_data)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創始人
0 java 2000年 45.6 James Gosling
1 python 1991年 67.0 Guido van Rossum
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js 2000年 59.5 Brendan Eich
4 php 2000年 69.9 Rasmus Lerdorf
5 C++ 2000年 75.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 1995年 45.6 James Gosling
1 python 1991年 67.0 Guido van Rossum
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js 1995年 59.5 Brendan Eich
4 php 2012年 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1972年 33.9 Dennis MacAlistair Ritchie
3 js 1995年 59.5 Brendan Eich
4 php 2012年 69.9 Rasmus Lerdorf
5 C++ 1983年 75 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 查詢數據