如何用IF函數(shù)詳細講解表格中的IFS函數(shù),如何用Excel、Python、SQL、Tableau實現(xiàn)IF函數(shù)。
如果詳細講解函數(shù),同時出現(xiàn)Excel Python SQL Tableau四個工具。
IF函數(shù)是Excel中最常用的函數(shù)之一,可以對值進行邏輯比較。這個函數(shù)的語法非常符合人類語言。
& ampquot如果.僅僅.否則.& ampquot
例如,如果你喜歡我,我們& amp#039;我會結(jié)婚,否則我們就贏了。#039;不要結(jié)婚。
用IF is=IF(& amp;quot你愛我。quot,& ampquot我們結(jié)婚了。quot,& ampquot我們結(jié)婚了。quot).
使用邏輯函數(shù)IF function時,如果條件為真,函數(shù)將返回值;如果條件為假,函數(shù)將返回另一個值。
第一個參數(shù)是條件true-false值,第二個參數(shù)是條件為true時的返回值,第三個參數(shù)是條件為false時的返回值。
這個函數(shù)也可以寫成無限嵌套模式(俗稱doll),IF() IF() IF,…如果,那么
這個例子主要解決了以下問題:
1如果成績大于等于600分,則返回"優(yōu)秀",否則返回"普通"
2如果成績大于等于600分,則返回"優(yōu)秀",大于等于500分小于600分返回"普通",小于500分返回"不優(yōu)秀"
3如果成績大于600分并且性別為男,則返回"男優(yōu)秀",如果成績大于600分且性別為女,返回"女優(yōu)秀",否則返回"不優(yōu)秀"
4如果語文成績大于120分,或者數(shù)學成績大于120分,則返回"單科優(yōu)秀",否則返回"普通"
5花名冊里技能字段如果包含“劍”字則返回“劍法”,如果包含“刀”字,則返回“刀法”,除此之外返回“其他 ”
6從字符串里提取指定位置的文本,本例從地址列文本里面進行提取省名、市名、縣名
實現(xiàn)方法:Excel,Python,SQL,Tableau。
Excel實現(xiàn)1如果得分大于或等于600分,則返回優(yōu)秀,否則返回普通。
在J2單元格中輸入公式:=IF(I2=600,優(yōu)秀,普通)。
如果得分大于等于600,則返回為優(yōu)秀;如果大于等于500,則作為普通返回;如果少于500,將作為& amp#039;不優(yōu)秀& amp#039;
在J2單元格中輸入公式:=IF(I2=600,優(yōu)秀,IF(I2=500,普通,& amp#039;不優(yōu)秀& amp#039;))
注意:此時有兩個IF函數(shù),其中一個是嵌套的。該語句首先判斷第一個IF,如果大于等于600,則返回excellent,然后將剩余的小于600的單元格區(qū)域拋給第二個IF函數(shù)進行判斷。因為此時里面都是600分以下的單元格,所以只需要在判斷條件里寫500分以上,不需要加上600分以下的條件,然后再做判斷。把500分以上的分數(shù)恢復正常,剩下的留到后面。如果有如果,繼續(xù)判斷。如果不是,統(tǒng)一返回最后一個If函數(shù)中的第三個參數(shù),是& amp#039;不優(yōu)秀& amp#039;如果你不& amp#039;不需要嵌套,如何使用IFS函數(shù)來實現(xiàn)這個例子?
請改用IFS函數(shù),并在J2單元格中輸入公式:=IFS(I2=600,優(yōu)秀,I2=500,普通,I2500,& amp#039;不優(yōu)秀& amp#039;).
用法:ifs([有事為真1,值為真1,有事為真2,值為真2,有事為真3,值為真3)。
至少要有兩個參數(shù),第一個參數(shù)是判斷條件,第二個參數(shù)是返回值,最多可以判斷127個條件,也就是254個參數(shù),類似于SUM的參數(shù)限制。
IFS函數(shù)檢查是否滿足一個或多個條件,并返回滿足第一個真條件的值。判斷是按順序進行的。這個函數(shù)可以替換多個嵌套的IF語句,在有多個條件的情況下更方便閱讀。
如果沒有找到真條件,該函數(shù)返回#N/A!錯誤,比如只輸入一個大于600分的條件判斷:=IFS(I2=600,& amp#039;優(yōu)秀& amp#039;).
此時,低于600分的部分將返回#N/A,即找不到。
此時我們需要添加一個iError來修復,比如分數(shù)小于600分,輸入公式為=iError (IFS (I2=600,& amp#039;優(yōu)秀& amp#039;)、& amp#039;普通& amp#039;).
IFERROR用法:IFERROR(value,value_if_error)
第一個參數(shù)是正常情況下返回的值,當?shù)谝粋€參數(shù)不能返回值時,第二個參數(shù)作為結(jié)果返回。
還有一個函數(shù)IFNA(),基本上和這個一樣。
這相當于使用復合函數(shù)。首先,如果(I3g
t;=600,"優(yōu)秀") 作為IFERROR函數(shù)的第一個參數(shù),這里可以完成大于等于600分以上條件的返回,這個參數(shù)IFERROR并不理會,而只有當這個條件不能返回時,即前面所說的查不到的#N/A部分,IFERROR函數(shù)會自動把這一部分的單元格返回第二個參數(shù),這里面也就是返回“普通”3如果成績大于600分并且性別為男,則返回"男優(yōu)秀",如果成績大于600分且性別為女,返回"女優(yōu)秀",否則返回"不優(yōu)秀"
輸入公式=IFERROR(IFS(AND(B11="男",I11>600),"男優(yōu)秀",AND(B11="女",I11>600),"女優(yōu)秀"),"普通")
說明:AND和OR函數(shù)
AND是且判斷,都為真時為真,只要有一個為假則為假,AND(1=1,2=2,3=3,4=4)為真,AND(1=1,2=2,3=3,4=5)為假
OR是或判斷,都為假時為假,只要有一個為真則為真,OR(1=2,3=4,5=6,7=8)為假,OR(1=2,3=4,5=6,7=7)為真
這兩個一般都需要配合前面的IF函數(shù)進行使用,應該很少有單獨使用場景
4如果語文成績大于120分,或者數(shù)學成績大于120分,則返回"單科優(yōu)秀",否則返回"普通"
輸入公式:=IF(OR(E2>120,F2>120),"單科優(yōu)秀","普通")
5花名冊里技能字段如果包含“劍”字則返回“劍法”,如果包含“刀”字,則返回“刀法”,除此之外返回“其他 ”
輸入公式:=IFERROR(IFS(ISNUMBER(FIND("劍",E2)),"劍法",ISNUMBER(FIND("刀",E2)),"刀法"),"其他")
IS類函數(shù)返回邏輯值:ISNUMBER 搭配 FIND函數(shù)使用,可以對指定單元格以判斷是否存在關(guān)鍵字詞進行對應返回
類似的函數(shù)還有以下:
FIND用法說明:FIND(find_text, within_text, [start_num])
第一個參數(shù)是要查找的關(guān)鍵字,這里我們輸入的是“劍”或者“刀”,此參數(shù)嚴格區(qū)分大小寫,并且不允許使用通配符
第二個參數(shù)是要在哪個文本里查找,我們這里在技能列查找,比如田伯光的技能“狂風刀法”
第三個參數(shù)可選,是從第幾個開始查詢,默認為1
拆解公式:FIND("刀","狂風刀法",1) 這個公式返回的是一個數(shù)字3,也就是說刀字在這個單元格字符里面的第3位,只要能返回數(shù)字不管在第幾位,也就意味著這個單元格里包含有我們要查找的關(guān)鍵字
然后我們再用ISNUMBER函數(shù)把這個數(shù)字3轉(zhuǎn)化為邏輯值真,為IFS函數(shù)提供參數(shù)用
ISNUMBER(FIND("刀","狂風刀法",1))返回值 為TRUE
我們可以看到除了田伯光技能’狂風刀法‘里面含有“刀”字,返回的是刀法,其他大多為劍法
這個函數(shù)用處場景較多,之前我曾見過某同事在處理大量數(shù)據(jù)時,用篩選包含關(guān)鍵字的形式一次一次地手動輸入返回值,如果能用這個函數(shù)則會極大提高數(shù)據(jù)處理效率
6從字符串里提取指定位置的文本,本例從地址列文本里面進行提取省名、市名、縣名
FIND查找函數(shù)配合字符提取函數(shù)LEFT,RIGHT,MID等,可以實現(xiàn)強大的字符提取功能:
從以下字符串中提取省名,=MID(A1,1,FIND(“省”,A1))
我們發(fā)現(xiàn)如果用LEFT進行向左直接取數(shù)字幾位的話無法實現(xiàn),因為有的省是兩個字,有的是三個字,這時我們就需要借助FIND對每一行的省名有幾個字符進行判斷
FIND("省",A1))返回值顯示包括省字在內(nèi)的省名個數(shù),比如前面兩條返回的是3,黑龍江的返回的為4
MID用法:MID(text, start_num, num_chars)
第一個參數(shù)表示,要從哪個字符串里提取,這里我們?nèi)列
第二個參數(shù)表示,從第幾個字符開始提取,這里我們填1,表示從頭進行提取
第三個參數(shù)表示,提取多少個字符,這里正是FIND函數(shù)起作用的地方
如前,假如提取省名不包括省字本身,則只需要在第三個參數(shù)后面減1即可,也就是提取字符少一位
=MID(A1,1,FIND("省",A1)-1)
這里我們也可以使用LEFT函數(shù),=LEFT(A1,FIND("省",A1))
LEFT函數(shù)只有兩個參數(shù),第一個是要提取的單元格,第二個是提取的位數(shù),從左
同理:RIGHT函數(shù)兩個參數(shù),第一個是要提取的單元格,第二個是提取的位數(shù),從右
如果把大慶市改為齊齊哈爾市,這回我們提取后面的市名,公式:=MID(A1,FIND("省",A1)+1,10)
這里FIND函數(shù)傳遞的值是作為MID函數(shù)的第二個參數(shù),也就是從第幾位開始提取,F(xiàn)IND("省",A1)+1表示出現(xiàn)省字后面第一個字符的位數(shù),第三個參數(shù)可以寫一個比較大的數(shù)字,只要提取的位數(shù)小于這個數(shù)值,則默認全部提取到最后
還可以用RIGHT提?。?RIGHT(A1,LEN(A1)-FIND("省",A1))
這里RIGHT的第二個參數(shù)是用了計算得來了,省名的位數(shù)FIND("省",A1),LEN(A1)表示全部的位數(shù),兩者相減得到的則是要提取的市名的位數(shù)
還可以再升級,后面加上縣名等,我們從中間提取市名=MID(A1,FIND("省",A1)+1,FIND("市",A1)-FIND("省",A1))
說明:
FIND("省",A1)+1 表示市名第一個文本出現(xiàn)在第幾位上
FIND("市",A1)-FIND("省",A1) 表示市名文本的字符長度,例如第一個,F(xiàn)IND("市",A1)=6表示市字出現(xiàn)在第6位,F(xiàn)IND("省",A1)=3,省字出現(xiàn)在第三位,兩者的差=6-3=3 則是“鐵嶺市”的字符長度
Python實現(xiàn):1如果成績大于等于600分,則返回"優(yōu)秀",否則返回"普通"
代碼如下:
def score_if(score):
if score >=600:
a = "優(yōu)秀"
else:
a = "普通"
return a
df["是否優(yōu)秀"] = df["總成績"].apply(lambda x:score_if(x))
這種我們是用lambda表達式實現(xiàn):
前面自定義一個函數(shù),score_if 進行邏輯判斷取數(shù)
df["是否優(yōu)秀"] = df["總成績"].apply(lambda x:score_if(x))
這條語句相當于把總成績那列應用到函數(shù)score_if,然后把返回值賦給”是否優(yōu)秀”列
附:本例還可以用一行代碼完成,使用lambda匿名函數(shù),這是一種沒有名稱的函數(shù)
df["是否優(yōu)秀"] = df["總成績"].apply(lambda x: "優(yōu)秀" if x>=600 else "普通")
2如果成績大于等于600分,則返回"優(yōu)秀",大于等于500分小于600分返回"普通",小于500分返回"不優(yōu)秀"
代碼如下:
def score_if(score):
if score >=600:
a = "優(yōu)秀"
elif score>=500:
a = "普通"
else:
a = "不優(yōu)秀"
return a
df["是否優(yōu)秀"] = df["總成績"].apply(lambda x:score_if(x))
這里第9行代碼也可以寫成這樣 df["是否優(yōu)秀"] = df["總成績"].apply(score_if)
appy 是應用的意思,這行表示把總成績列作為score_if函數(shù)的參數(shù),然后函數(shù)返回值賦給是否優(yōu)秀列
如果用lambda函數(shù),一行代碼:
df["是否優(yōu)秀"] = df["總成績"].apply(lambda x: "優(yōu)秀"if x>=600 else("普通"if x>=500 else"不優(yōu)秀"))
3如果成績大于600分并且性別為男,則返回"男優(yōu)秀",如果成績大于600分且性別為女,返回"女優(yōu)秀",否則返回"不優(yōu)秀"
代碼如下:
def score_if(score,sex):
if score >=600 and sex=="男":
a = "男優(yōu)秀"
elif score >=600 and sex=="女":
a = "女優(yōu)秀"
else:
a ="普通"
return a
df = pd.read_excel("c:/study_note/xiao_if.xlsx",sheet_name="成績單")
df['是否優(yōu)秀'] = df.apply(lambda df:score_if(df['總成績'],df['性別']),axis=1)
附:還有一種寫法如下
def score_if(score,sex):
if score >=600 and sex=="男":
a = "男優(yōu)秀"
elif score >=600 and sex=="女":
a = "女優(yōu)秀"
else:
a ="普通"
return a
df = pd.read_excel("c:/study_note/xiao_if.xlsx",sheet_name="成績單")
df["是否優(yōu)秀"] = None
for i in range(len(df)):
df["是否優(yōu)秀"][i] = score_if(df["總成績"][i],df["性別"][i])
這里用到了條件且在自定義函數(shù)里面,因為自定義函數(shù)有兩個參數(shù),我再后面用了一個for循環(huán)語句
第10行:新建一個字段,命名為‘是否優(yōu)秀’
第11行,讓變量i進行循環(huán),len(df)表示原表的行數(shù),等于18,range(18)相當于讓i從0取到17
第12行,把每一行的總成績列值作為函數(shù)的第一個參數(shù),性別列值作為第二個參數(shù),然后把返回值賦給是否優(yōu)秀列,因為i是變量,從0到17(意義表示從第1行到第18行)
在python中and和or函數(shù),布爾類型也是只有True和False兩種取值,python中的布爾運算符and,or,not全是小寫
邏輯運算和Excel一樣
但是當用pandas庫的數(shù)據(jù)類型 DataFrame 和Series 時進行邏輯運算時,此時運算符變成
& 表示 and 且
| 表示 or 或
~ 表示not 非
4如果語文成績大于120分,或者數(shù)學成績大于120分,則返回"單科優(yōu)秀",否則返回"普通"
代碼:
def score_if(chi,math):
if chi >=120 or math >=120:
a = "單科優(yōu)秀"
else:
a ="普通"
return a
df = pd.read_excel("c:/study_note/xiao_if.xlsx",sheet_name="成績單")
df['是否優(yōu)秀'] = df.apply(lambda df:score_if(df['語文'],df['數(shù)學']),axis=1)
5花名冊里技能字段如果包含“劍”字則返回“劍法”,如果包含“刀”字,則返回“刀法”,除此之外返回“其他 ”
代碼如下:
df = pd.read_excel("c:/study_note/xiao_if.xlsx",sheet_name="花名冊")
col_name = df.columns.tolist()
col_name.insert(col_name.index("技能")+1,"技能類型")
df = df.reindex(columns=col_name)
def tech(x):
if x.find("劍") >=0:
a = "劍法"
elif x.find("刀")>=0:
a = "刀法"
else:
a = "其他"
return a
df['技能類型'] = df['技能'].apply(tech)
第3行:把原表所有列名轉(zhuǎn)換為列表格式,并傳遞給變量col_name
第4行:在列名列表里‘技能’文本后面新插入一個文本‘技能類型’,作為一個新的字段列名
第5行:把新增加的字段傳遞給原表df
第6行: x.find(參數(shù)),表示在x單元格查找參數(shù)所有的位置,如果單元格里存在參數(shù),則返回位置數(shù)字,如果不存在則返回-1,如果參數(shù)在單元格第1位,則返回0,因為在python里順序是從0開始,0代表第一位,x.find("劍") >=0表示單元格值里面存在“劍”這個關(guān)鍵詞,相當于Excel時面函數(shù)ISNUMBER(FIND("劍","獨孤九劍",1))返回值為TRUE一樣
6從字符串里提取指定位置的文本,本例從地址列文本里面進行提取省名、市名、縣名
代碼如下:
df["省"] = df["地址"].apply(lambda x: x[0:x.find("省")+1])
df["市"] = df["地址"].apply(lambda x: x[x.find("省")+1:x.find("市")+1])
df["縣"] = df["地址"].apply(lambda x: x[x.find("市")+1:])
這里直接用了python里面的切片(slicing)語法:sequence[start:stop:step]
sequence是序列的意思,第一個參數(shù)是起始位置,第二個參數(shù)是結(jié)束位置(不包括本身,相當于數(shù)學里面的左閉右開區(qū)間),第三個參數(shù)是步長,舉例:a = “遼寧省鐵嶺市昌圖縣八面城鎮(zhèn)“在本例中文本值作為一個序列
a[0:3]表示:從第1位開始取3位(0,1,2)
a[:3]表示:和上面一樣,只是省略了第1個參數(shù)
a[::]表示全取,三個參數(shù)都省略了
a[-4:] 表示從右邊第三位開始向右取數(shù)取到最后
a[::2]表示每兩個元素取一個
a[-1:-5:-1]表示從右往左取4位,這里面第二個參數(shù)和第三個參數(shù)都是負數(shù),第二個參數(shù)相當于從右往左數(shù)第5位(是開區(qū)間不取本身),第三個參數(shù)1是步長,每個都取,負號表示從右往左取
三、SQL實現(xiàn)方法:
1如果成績大于等于600分,則返回"優(yōu)秀",否則返回"普通"
代碼如下:
SELECT 姓名,總成績, IF(總成績>=600,"優(yōu)秀","普通") AS 是否優(yōu)秀 FROM score ;
2如果成績大于等于600分,則返回"優(yōu)秀",大于等于500分小于600分返回"普通",小于500分返回"不優(yōu)秀"
代碼如下:
SELECT 姓名,總成績, IF(總成績>=600,"優(yōu)秀",IF(總成績>=500,"普通","不優(yōu)秀")) AS 是否優(yōu)秀 FROM score ;
上面這條查詢也可以寫成下面這樣:
SELECT 姓名,總成績,
CASE WHEN 總成績>=600 THEN "優(yōu)秀"
WHEN 總成績>=500 THEN "普通"
ELSE "不優(yōu)秀"
END AS 是否優(yōu)秀
FROM score ;
3如果成績大于600分并且性別為男,則返回"男優(yōu)秀",如果成績大于600分且性別為女,返回"女優(yōu)秀",否則返回"不優(yōu)秀"
代碼如下:
SELECT 姓名,總成績,
CASE WHEN 總成績>=600 AND 性別="男" THEN "男優(yōu)秀"
WHEN 總成績>=600 AND 性別='女' THEN "女優(yōu)秀"
ELSE "普通"
END AS 是否優(yōu)秀
FROM score ;
在MYSQL中AND 和 OR函數(shù),布爾類型也是只有True和False兩種取值
NOT 符號是! 非
AND 符號是 && 且
OR 符號是|| 或
XOR 表示異或
a XOR b 這個邏輯運算相當于 a AND (NOT b) 或者 (NOT a) AND b
算法與Excel一樣
4如果語文成績大于120分,或者數(shù)學成績大于120分,則返回"單科優(yōu)秀",否則返回"普通":
SELECT 姓名,語文,數(shù)學,
CASE WHEN 語文>=120 OR 數(shù)學>=120 THEN "單科優(yōu)秀"
ELSE "普通"
END AS 是否優(yōu)秀
FROM score ;
5花名冊里技能字段如果包含“劍”字則返回“劍法”,如果包含“刀”字,則返回“刀法”,除此之外返回“其他 ”
代碼如下:
SELECT 姓名,技能,
CASE WHEN 技能 REGEXP "[刀]" THEN "刀法"
WHEN 技能 REGEXP "[劍]" THEN "劍法"
ELSE "其他"
END AS 技能類型
FROM names;
6從字符串里提取指定位置的文本,本例從地址列文本里面進行提取省名、市名、縣名
代碼如下:
SELECT 地址,
MID(地址,1,LOCATE("省",地址)) AS 省,
MID(地址,LOCATE("省",地址)+1,locate("市",地址)-LOCATE("省",地址)) AS 市,
MID(地址,LOCATE("市",地址)+1,locate("縣",地址)-LOCATE("市",地址)) AS 縣
FROM temp3;
這里MID函數(shù)不同于Excel,SQL里是可以引入負數(shù)作為第二個參數(shù),代表的意思是從右往左,locate本身就是定位的意思,這個函數(shù)相當于Excel里的FIND函數(shù)
比如SELECT mid("basketball",-4); 這里省略了第三個參數(shù),從這個字符最右往左數(shù)第4位開始取數(shù),一直向右取到完
SELECT mid("basketball",-4,2); 如果加上第三個參數(shù),從這個字符最右往左數(shù)第4位開始取數(shù),取數(shù)長度為2位
本例還可以用LEFT 和RIGHT函數(shù)進行提?。捍a如下
SELECT 地址,
LEFT(地址,LOCATE("省",地址)) AS 省,
MID(地址,LOCATE("省",地址)+1,locate("市",地址)-LOCATE("省",地址)) AS 市,
RIGHT(地址,CHAR_LENGTH(地址)-LOCATE("市",地址)) AS 縣
FROM temp3;
四、Tableau實現(xiàn):
1如果成績大于等于600分,則返回"優(yōu)秀",否則返回"普通"
打開Tableau軟件,連接到工作表成績單,然后創(chuàng)建一個計算字段輸入公式:
IF [總成績] >= 600 THEN "優(yōu)秀" ELSE "不優(yōu)秀" END
2如果成績大于等于600分,則返回"優(yōu)秀",大于等于500分小于600分返回"普通",小于500分返回"不優(yōu)秀"
計算字段代碼如下:
IF [總成績] >=600 THEN "優(yōu)秀"
ELSEIF [總成績] >=500 THEN "普通"
ELSE "不優(yōu)秀" END
3如果成績大于600分并且性別為男,則返回"男優(yōu)秀",如果成績大于600分且性別為女,返回"女優(yōu)秀",否則返回"不優(yōu)秀"
計算字段代碼如下:
IF [總成績] >=600 AND [性別]=='男' THEN "男優(yōu)秀"
ELSEIF [總成績] >=600 AND [性別]=='女' THEN "女優(yōu)秀"
ELSE "普通" END
4如果語文成績大于120分,或者數(shù)學成績大于120分,則返回"單科優(yōu)秀",否則返回"普通"
代碼如下:
IF [語文] >=120 OR [數(shù)學] >=120 THEN "單科優(yōu)秀"
ELSE "普通" END
5花名冊里技能字段如果包含“劍”字則返回“劍法”,如果包含“刀”字,則返回“刀法”,除此之外返回“其他 ”
新建Tableau工作簿,并連接到花名冊表,新建計算字段技能類型,代碼如下:
IF CONTAINS([技能],"劍") THEN "劍法"
ELSEIF CONTAINS([技能],"刀") THEN "刀法"
ELSE "其他" END
CONTAINS函數(shù)是Tableau特有的,返回的也是一個布爾邏輯值,相當于SQL中的WHEN 技能 REGEXP "[刀]" (這里是正則查找,返回的也是邏輯值),也相當于Excel中的ISNUMBER(FIND("刀","狂風刀法",1))
6從字符串里提取指定位置的文本,本例從地址列文本里面進行提取省名、市名、縣名
代碼:
計算字段?。篗ID([地址],1,FIND([地址],"省"))
計算字段市:MID([地址],FIND([地址],"省")+1,FIND([地址],"市")-FIND([地址],"省"))
計算字段縣:MID([地址],FIND([地址],"市")+1,LEN([地址])-FIND([地址],"市"))
需要注意,Tableau中的FIND函數(shù)和Excel中的FIND函數(shù)兩個參數(shù)的位置正好相反
到此四種工具全部完成任務,如果覺得有用請點下關(guān)注,可以和本人互動交流,共同學習進步
python如何創(chuàng)建excel 語句 用python列出滿足條件的excel表格