從基礎(chǔ)操作到高效實踐詳解DataFrame數(shù)據(jù)修改的完整指南
引言:為什么數(shù)據(jù)修改是數(shù)據(jù)分析的“隱形冠軍”
在真實項目中,原始數(shù)據(jù)往往存在以下問題:
- 缺失值用
-1或NULL填充 - 日期格式混亂(如
20230101vs01-Jan-2023) - 分類變量編碼不一致(如
男/M/1表示同一性別)
數(shù)據(jù)修改(Data Mutation)是解決這些問題的核心能力,它直接影響后續(xù)分析的準(zhǔn)確性。本文將通過 6類操作 + 4個實戰(zhàn)案例,系統(tǒng)講解如何安全、高效地修改DataFrame數(shù)據(jù)。
一、基礎(chǔ)修改操作:替換與賦值
1. 單單元格修改
直接通過列名和索引定位單元格:
import pandas as pd
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, None],
'City': ['NY', 'LA', 'Chicago']
})
# 將第2行(索引1)的Age改為35
df.at[1, 'Age'] = 35 # 推薦:at用于標(biāo)量訪問
# 或
df.loc[1, 'Age'] = 35 # loc也可用
2. 整列修改
直接對列賦值(支持標(biāo)量、列表、Series):
# 將所有City改為大寫 df['City'] = df['City'].str.upper() # 用新列表替換整列 df['Age'] = [26, 35, 32] # 長度必須匹配
3. 條件替換(where()vsmask())
df.where(cond, other):保留滿足條件的值,不滿足的替換為otherdf.mask(cond, other):替換滿足條件的值為other,保留不滿足的
# 將Age<30的替換為0(保留其他值) df['Age'] = df['Age'].where(df['Age'] >= 30, 0) # 等價寫法(更直觀) df['Age'] = df['Age'].mask(df['Age'] < 30, 0)
二、批量修改技巧:映射與替換
1.replace():精確值替換
# 將City中的'NY'替換為'New York'
df['City'] = df['City'].replace('NY', 'New York')
# 多值替換(字典形式)
df['City'] = df['City'].replace({
'LA': 'Los Angeles',
'CHICAGO': 'Chicago' # 注意大小寫敏感
})
2.map():基于字典的映射
適用于分類變量編碼轉(zhuǎn)換:
# 創(chuàng)建性別編碼映射
gender_map = {'男': 'M', '女': 'F', '未知': 'U'}
df['Gender'] = df['Gender'].map(gender_map)
# 未映射的值會變?yōu)镹aN,可用fillna處理
df['Gender'] = df['Gender'].map(gender_map).fillna('Other')
3.apply():自定義函數(shù)修改
當(dāng)邏輯復(fù)雜時,用lambda或函數(shù):
# 將Age列轉(zhuǎn)換為字符串并添加' years'
df['Age'] = df['Age'].apply(lambda x: f"{int(x)} years" if pd.notnull(x) else 'Unknown')
# 多列同時修改
def clean_data(row):
row['Name'] = row['Name'].title() # 首字母大寫
row['City'] = row['City'].upper()
return row
df = df.apply(clean_data, axis=1) # axis=1表示按行操作
三、進階修改場景
1. 基于索引的修改
# 修改索引為[0,2]的行的Age列 df.loc[[0, 2], 'Age'] = [27, 33] # 使用切片修改連續(xù)行 df.loc[0:2, 'City'] = ['NYC', 'LAX', 'CHI'] # 注意包含末端
2. 添加/刪除列時的修改
# 添加新列(基于現(xiàn)有列計算)
df['Age_Group'] = pd.cut(df['Age'], bins=[0, 30, 100], labels=['Young', 'Senior'])
# 刪除列后重新添加(重置數(shù)據(jù))
df.drop('Age_Group', axis=1, inplace=True)
df['Age_Group'] = ... # 重新計算
3. 鏈?zhǔn)讲僮鳎–haining)
結(jié)合多個修改步驟(注意可讀性):
df = (
df.assign(Age_Squared=lambda x: x['Age']**2) # 添加新列
.query("Age > 20") # 篩選
.drop('City', axis=1) # 刪除列
)
四、實戰(zhàn)案例:電商數(shù)據(jù)清洗
案例1:統(tǒng)一價格單位
原始數(shù)據(jù)中價格單位混用(元/千元):
df = pd.DataFrame({
'Product': ['A', 'B', 'C'],
'Price': [1500, 2.5, 800],
'Unit': ['元', '千元', '元']
})
# 將千元轉(zhuǎn)換為元
df['Price'] = df.apply(
lambda row: row['Price'] * 1000 if row['Unit'] == '千元' else row['Price'],
axis=1
)
df['Unit'] = '元' # 統(tǒng)一單位
案例2:標(biāo)準(zhǔn)化日期格式
df = pd.DataFrame({
'OrderID': [1001, 1002],
'Date': ['20230115', '15-Jan-2023']
})
# 統(tǒng)一轉(zhuǎn)換為YYYY-MM-DD
df['Date'] = pd.to_datetime(df['Date']).dt.strftime('%Y-%m-%d')
案例3:缺失值填充策略
# 根據(jù)列特性選擇填充方式
df['Age'].fillna(df['Age'].median(), inplace=True) # 數(shù)值列用中位數(shù)
df['Gender'].fillna('Unknown', inplace=True) # 分類列用眾數(shù)或固定值
五、避坑指南:5個常見錯誤
1.修改時未用copy()導(dǎo)致SettingWithCopyWarning
錯誤寫法:df[df['Age']>30]['City'] = 'Old'
正確寫法:df.loc[df['Age']>30, 'City'] = 'Old'
2.鏈?zhǔn)讲僮髦须[式復(fù)制
# 危險!可能修改的是副本而非原數(shù)據(jù) subset = df[df['Age']>30]['City'] subset[:] = 'Old'
3.忽略數(shù)據(jù)類型轉(zhuǎn)換
# 字符串列無法直接參與數(shù)學(xué)運算 df['Price'] = df['Price'].astype(float) # 先轉(zhuǎn)換類型
4.過度使用apply()
對于簡單操作,優(yōu)先用向量化方法(如str.upper()比apply(lambda x: x.upper())快10倍)。
5.未處理inplace參數(shù)
# 明確是否修改原數(shù)據(jù)
df.drop('Col', axis=1) # 未生效!需加inplace=True或賦值
df = df.drop('Col', axis=1) # 推薦寫法
總結(jié):數(shù)據(jù)修改的“黃金法則”
- 先查看再修改:用
df.head()和df.info()確認(rèn)數(shù)據(jù)結(jié)構(gòu) - 優(yōu)先向量化:避免逐行操作的低效
- 備份原數(shù)據(jù):修改前用
df_original = df.copy() - 驗證結(jié)果:通過
df.describe()和抽樣檢查修改是否生效
下一步建議:
- 學(xué)習(xí)
pd.cut()和pd.qcut()實現(xiàn)分箱操作 - 探索
sklearn.preprocessing中的標(biāo)準(zhǔn)化/歸一化方法 - 掌握
DataFrame.update()實現(xiàn)基于另一個DataFrame的修改
以上就是從基礎(chǔ)操作到高效實踐詳解DataFrame數(shù)據(jù)修改的完整指南的詳細(xì)內(nèi)容,更多關(guān)于DataFrame數(shù)據(jù)修改的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python連接access數(shù)據(jù)庫兩種方式總結(jié)
這篇文章主要介紹了python連接access數(shù)據(jù)庫兩種方式的相關(guān)資料,SQLAlchemy使用access方言進行連接,而pyodbc則通過pyodbc模塊實現(xiàn)連接,文章還提供了連接代碼示例,需要的朋友可以參考下2025-02-02
Python爬取百度地圖POI數(shù)據(jù)代碼的步驟
爬取百度地圖的POI數(shù)據(jù)涉及法律和道德問題,因為這類數(shù)據(jù)受到版權(quán)保護,且大多數(shù)在線地圖服務(wù)都有嚴(yán)格的反爬蟲措施,這篇文章主要介紹了Python爬取百度地圖POI數(shù)據(jù)代碼,需要的朋友可以參考下2024-08-08
Python實現(xiàn)多場景下Word文檔水印添加的實戰(zhàn)指南
在文檔管理和版權(quán)保護場景中,為 Word 文檔添加水印是一項常見且實用的需求,本文將深入探討如何使用 Python 實現(xiàn)多種場景下的 Word 文檔水印添加功能,希望對大家有所幫助2026-03-03

