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