亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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 查詢數據