Pandas 修改數(shù)據(jù)
1. 前言
通過前幾節(jié)的學習,我們掌握了 Pandas 查詢、新增和刪除數(shù)據(jù)的操作,基本上能夠進行大部分的數(shù)據(jù)處理操作,而作為數(shù)據(jù)處理中另外一個重要的內容——修改操作,Pandas 中又是如何進行的呢?
本小節(jié)我將講述 Pandas 對數(shù)據(jù)的修改操作,包括了對索引值的修改,以及對數(shù)據(jù)值的修改操作,通過這兩板塊的內容,使大家能夠根據(jù)自己的需要,靈活的變更數(shù)據(jù)內容。
2. 修改索引值
很多時候我們創(chuàng)建的數(shù)據(jù),或者解析出來的數(shù)據(jù),索引都是默認生成的,而我們?yōu)榱朔奖銛?shù)據(jù)的分析,需要對數(shù)據(jù)的行索引值或者列索引值進行修改,那這里 Pandas 中提供了一個函數(shù) rename(self, mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors=‘ignore’),該函數(shù)通過靈活的參數(shù)設置,能夠高效便捷的進行索引值的修改,下面我們列舉了常用的幾個參數(shù)說明:
參數(shù)名 | 說明 |
---|---|
mapper | 這里是要傳入的映射關系,可以是個字典或者函數(shù) |
index | 指定行索引 |
columns | 指定列索引 |
axis | 表示修改行索引(axis=0 默認)還是列索引(axis=1) |
inplace | 是否在原數(shù)據(jù)基礎上修改,默認 inplace=False 會返回一個新的數(shù)據(jù)集 |
2.1 修改行索引值
# 導入pandas包
import pandas as pd
# 指定導入的文件地址
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 參數(shù)指定映射關系,修改了列索引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小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 主要創(chuàng)始人
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 主要創(chuàng)始人
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. 修改數(shù)據(jù)值
3.1 修改單個數(shù)據(jù)值
修改單個數(shù)據(jù)值,是通過查詢函數(shù)獲取到某個數(shù)據(jù),然后修改這個數(shù)據(jù)的內容,可以用函數(shù) at[]、iat[]、loc[]、iloc[],但要注意不同的函數(shù)所傳遞參數(shù)的不同,下面我們列舉這四個函數(shù)的不同之處:
函數(shù) | 說明 |
---|---|
loc[] | 只能使用標簽索引,不能使用整數(shù)索引,通過標簽索引切邊進行篩選時 |
iloc[] | 只能使用整數(shù)索引,不能使用標簽索引,通過整數(shù)索引切邊進行篩選時 |
at[] | 只能使用標簽索引,使用時必須輸入兩個參數(shù),即行索引和列索引 |
iat[] | 只能使用整數(shù)索引,使用時必須輸入兩個參數(shù),即行索引和列索引 |
雖然四種函數(shù)都能獲取單個數(shù)據(jù)值,進而進行修改,但從運行速度上四種方法從高到底分別為: iat[]、at[]、iloc[]、loc[],這里我們選擇 iat[] 演示對單個數(shù)據(jù)值的修改操作:
# 導入pandas包
import pandas as pd
# 指定導入的文件地址
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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列進行數(shù)據(jù)修改
data.iat[1,2]=3432
print(data)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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列數(shù)據(jù)進行修改,通過輸出結果可看到原數(shù)據(jù)值為67.0,這里被修改3432.0
3.2 修改某類數(shù)據(jù)值
有時候我們需要對數(shù)據(jù)集中的一類數(shù)據(jù)進行修改,比如我們要將所有的“1995年”換成字符串“2000年”,這時我們就需要用到函數(shù) replace(to_replace=None,value=None……),該函數(shù)的兩個核心參數(shù) to_replace 表示要被替換的數(shù)據(jù),value 是替換后的數(shù)據(jù),該函數(shù)修改后,會返回新的數(shù)據(jù)集,不會影響到原數(shù)據(jù)。
# 導入pandas包
import pandas as pd
# 指定導入的文件地址
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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年”數(shù)據(jù)修改為“2000年”
new_data=data.replace("1995年","2000年")
print(new_data)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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
輸出解析:這里可以看到原數(shù)據(jù)中所有的“1995年”都被改成了“2000年”。這里我們要被修改的值也可以傳入列表的形式,指定多個被修改的數(shù)據(jù)值,如下面代碼所示:
# 這里我們傳入list數(shù)據(jù)集,對這幾個數(shù)據(jù)進行修改為“2000年”
new_data=data.replace(["1995年","2012年","1983年"],"2000年")
print(new_data)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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
輸出解析:通過輸出結果可以看到,原數(shù)據(jù)集中的1995年,2012年,1983年都被修改為了“2000年”。
3.2 修改某區(qū)域數(shù)據(jù)值
我們還可以對某些行或列的數(shù)據(jù)進行統(tǒng)一的修改操作,這里我們可以使用函數(shù) loc() 或 iloc() ,只是要注意傳入的參數(shù)不同。下面我們使用 iloc() 修改整行或整列的數(shù)據(jù)操作:
# 導入pandas包
import pandas as pd
# 指定導入的文件地址
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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
# 這里我們創(chuàng)建了一個新的數(shù)據(jù)集
data_new= pd.DataFrame([["11","22","33.5","44"], ["55","66","77.7","88"]],
columns=["編程語言","推出時間","價格","主要創(chuàng)始人"])
data.iloc[[0,1]]=data_new
print(data)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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
輸出解析:我們創(chuàng)建了一個新的數(shù)據(jù)集,用來替換原數(shù)據(jù)第1行和第2行的數(shù)據(jù),通過輸出結果可以看到被修改后的數(shù)據(jù)集。
下面我們來修改一整列的數(shù)據(jù):
# 創(chuàng)建了一個Series對象
new_series=pd.Series(["11","22","3","44","55","66"] )
data.iloc[:,[1]]=new_series
print(data)
# --- 輸出結果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 對象用來替換第二列的數(shù)據(jù)值,通過輸出結果可以看到為我們第二列的數(shù)據(jù)值被修改的結果。
4.小結
本節(jié)課我們主要學習了如何修改數(shù)據(jù)集中的索引和數(shù)據(jù)值,并詳細介紹了對行索引和列索引的修改,細化了數(shù)據(jù)值修改的幾種方式,包括單個數(shù)據(jù)值的修改,一類數(shù)據(jù)的修改和某個區(qū)域的數(shù)據(jù)修改。本節(jié)課程的重點如下:
- 修改索引值 rename() 函數(shù)的使用;
- 修改數(shù)據(jù)使用 iat[] 函數(shù),replace() 函數(shù) ,iloc() 函數(shù)操作的方法。
Tips:想要學習更多Pandas相關知識,可以點擊
Pandas 新增數(shù)據(jù)
Pandas 刪除數(shù)據(jù)
Pandas 查詢數(shù)據(jù)