Python Pandas實(shí)現(xiàn)根據(jù)多列的值生成新的列
在 Pandas 中,可以根據(jù) 多列的值 生成新的列,常見的方法包括:
apply()+ 自定義函數(shù)(最靈活)np.where()或np.select()(條件判斷)- 直接數(shù)學(xué)運(yùn)算(如
df['A'] + df['B']) assign()+ lambda(鏈?zhǔn)讲僮鳎?/li>eval()(高效計(jì)算,但需謹(jǐn)慎使用)
1. 使用apply()+ 自定義函數(shù)(推薦)
適用于 復(fù)雜邏輯,可以基于多列計(jì)算新列。
import pandas as pd
df = pd.DataFrame({
'math': [90, 80, 70],
'english': [85, 75, 65],
'science': [88, 92, 78]
})
# 定義一個(gè)函數(shù),基于多列計(jì)算平均分
def calculate_average(row):
return (row['math'] + row['english'] + row['science']) / 3
# 使用 apply() 按行計(jì)算
df['average'] = df.apply(calculate_average, axis=1)
print(df)
輸出:
math english science average
0 90 85 88 87.666667
1 80 75 92 82.333333
2 70 65 78 71.000000
優(yōu)化:使用lambda簡(jiǎn)化
df['average'] = df.apply(lambda row: (row['math'] + row['english'] + row['science']) / 3, axis=1)
2. 使用np.where()或np.select()(條件判斷)
適用于 基于多列條件 生成新列。
(1)np.where()(二分類)
import numpy as np # 如果 math 和 english 都 > 80,則 '優(yōu)秀',否則 '普通' df['grade'] = np.where((df['math'] > 80) & (df['english'] > 80), '優(yōu)秀', '普通') print(df)
輸出:
math english science average grade
0 90 85 88 87.666667 優(yōu)秀
1 80 75 92 82.333333 普通
2 70 65 78 71.000000 普通
(2)np.select()(多條件)
conditions = [
(df['math'] >= 90) & (df['english'] >= 90),
(df['math'] >= 80) & (df['english'] >= 80),
(df['math'] >= 70) & (df['english'] >= 70)
]
choices = ['A', 'B', 'C']
df['grade'] = np.select(conditions, choices, default='D')
print(df)
輸出:
math english science average grade
0 90 85 88 87.666667 B
1 80 75 92 82.333333 C
2 70 65 78 71.000000 D
3. 直接數(shù)學(xué)運(yùn)算(簡(jiǎn)單計(jì)算)
適用于 多列直接運(yùn)算(如加權(quán)平均、總分等)。
# 計(jì)算總分(math + english + science) df['total'] = df['math'] + df['english'] + df['science'] # 計(jì)算加權(quán)平均(math 權(quán)重 0.5,english 0.3,science 0.2) df['weighted_avg'] = df['math'] * 0.5 + df['english'] * 0.3 + df['science'] * 0.2 print(df)
輸出:
math english science total weighted_avg
0 90 85 88 263 87.300000
1 80 75 92 247 79.900000
2 70 65 78 213 70.100000
4. 使用assign()+lambda(鏈?zhǔn)讲僮鳎?/h2>
適用于 不修改原 DataFrame,而是返回新 DataFrame。
df = df.assign(
total=lambda x: x['math'] + x['english'] + x['science'],
weighted_avg=lambda x: x['math'] * 0.5 + x['english'] * 0.3 + x['science'] * 0.2
)
print(df)
輸出:
math english science total weighted_avg
0 90 85 88 263 87.300000
1 80 75 92 247 79.900000
2 70 65 78 213 70.100000
5. 使用eval()(高效計(jì)算,但需謹(jǐn)慎)
適用于 快速計(jì)算,但可能影響可讀性。
# 計(jì)算總分
df['total'] = df.eval('math + english + science')
# 計(jì)算加權(quán)平均
df['weighted_avg'] = df.eval('math * 0.5 + english * 0.3 + science * 0.2')
print(df)
輸出:
math english science total weighted_avg
0 90 85 88 263 87.300000
1 80 75 92 247 79.900000
2 70 65 78 213 70.100000
總結(jié)
| 方法 | 適用場(chǎng)景 | 示例 |
|---|---|---|
| apply() + 自定義函數(shù) | 復(fù)雜邏輯 | df.apply(lambda row: row['A'] + row['B'], axis=1) |
| np.where() / np.select() | 條件判斷 | np.where((df['A'] > 0) & (df['B'] < 0), '符合', '不符合') |
| 直接運(yùn)算 | 簡(jiǎn)單計(jì)算 | df['total'] = df['A'] + df['B'] + df['C'] |
| assign() + lambda | 鏈?zhǔn)讲僮?/td> | df.assign(new_col=lambda x: x['A'] * 2) |
| eval() | 高效計(jì)算 | df.eval('A + B * C') |
最佳實(shí)踐:
- 簡(jiǎn)單計(jì)算 → 直接
+ - * /或assign() - 復(fù)雜邏輯 →
apply()+lambda或自定義函數(shù) - 條件判斷 →
np.where()(二分類)或np.select()(多條件) - 避免
eval()(除非性能關(guān)鍵,否則可讀性較差)
示例:綜合應(yīng)用
# 計(jì)算總分
df['total'] = df['math'] + df['english'] + df['science']
# 計(jì)算加權(quán)平均
df['weighted_avg'] = df.eval('math * 0.5 + english * 0.3 + science * 0.2')
# 判斷是否優(yōu)秀(math 和 english 都 > 85)
df['is_excellent'] = np.where((df['math'] > 85) & (df['english'] > 85), 'Yes', 'No')
print(df)
輸出:
math english science total weighted_avg is_excellent
0 90 85 88 263 87.300000 No
1 80 75 92 247 79.900000 No
2 70 65 78 213 70.100000 No
這樣,你可以靈活地基于多列數(shù)據(jù)生成新列!
到此這篇關(guān)于Python Pandas實(shí)現(xiàn)根據(jù)多列的值生成新的列的文章就介紹到這了,更多相關(guān)Pandas根據(jù)多列的值生成列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 動(dòng)態(tài)生成變量名以及動(dòng)態(tài)獲取變量的變量名方法
今天小編就為大家分享一篇python 動(dòng)態(tài)生成變量名以及動(dòng)態(tài)獲取變量的變量名方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Python編程實(shí)現(xiàn)輸入某年某月某日計(jì)算出這一天是該年第幾天的方法
這篇文章主要介紹了Python編程實(shí)現(xiàn)輸入某年某月某日計(jì)算出這一天是該年第幾天的方法,涉及Python針對(duì)日期時(shí)間的轉(zhuǎn)換與運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-04-04
使用Python簡(jiǎn)單實(shí)現(xiàn)去除彩色水印
這篇文章主要為大家詳細(xì)介紹了如何使用Python簡(jiǎn)單實(shí)現(xiàn)去除彩色水印效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
Python實(shí)戰(zhàn)之能監(jiān)控文件變化的神器—看門狗
這篇文章主要介紹了Python實(shí)戰(zhàn)之能監(jiān)控文件變化的神器—看門狗,文中有非常詳細(xì)的圖文及代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05
使用python-docx在word文檔中查找書簽,并在書簽處寫入數(shù)據(jù)方式
使用python-docx庫(kù),可在Word文檔中查找書簽并寫入數(shù)據(jù)。首先打開文檔,通過bookmarks屬性獲取書簽對(duì)象,然后使用書簽名定位書簽位置,最后將數(shù)據(jù)寫入書簽處。這種方法適合自動(dòng)化填充Word模板等場(chǎng)景2024-09-09
基于nexus3配置Python倉(cāng)庫(kù)過程詳解
這篇文章主要介紹了基于nexus3配置Python倉(cāng)庫(kù)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
python f-string式格式化聽語(yǔ)音流程講解
在本篇文章中小編給大家整理的是關(guān)于python f-string式格式化聽語(yǔ)音的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2019-06-06
python中的torch常用tensor處理函數(shù)示例詳解
這篇文章主要介紹了python中的torch常用tensor處理函數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07

