前面已經介紹了最重要的求和sum,sumifs,sumproduct等函數,統計類函數還有很多,比如計數函數count,countb,countifs,求平均值函數average,avergeifs,排名函數rank.eq,rank.avg最大值max,maxifs,最小值min,minifs,百分位排名函數percentrank.inc,分位值函數percentile.inc,篩選條件下分類彙總函數subtotal,本文都會做出講解并按執行個體進行示範:
問題1:提取成績單表格裡是數值的單元格個數,和非空的單元格總的個數
問題2:提取全部總成績的最大值、最小值,以及華山派總成績的最大值、最小值
問題3:按總成績分數多少進行排名
問題4:分别求出各門派的人數,各門派性别為男的人數
問題5:求出所有成績的平均值,以及求出按門派分類總成績的平均值
問題6:求出總成績在90%分位上的值,以及求出每個人成績排名的分位值
Excel實作:問題1:提取成績單表格裡是數值的單元格個數,以及非空單元格總的個數
隻統計數值單元格公式 =COUNT(A1:I19)
統計包括文本單元格公式=COUNTA(A1:I19)
說明:
COUNT(value1, [value2], ...),函如其名count英文本身就是計數的意思,是以這個函數計算包含數字的單元格個數以及參數清單中數字的個數
COUNTA(value1, [value2], ...) 這裡面count後的a是英文all的意思,即COUNTA函數計算包含任何類型的資訊(包括錯誤值和空文本 (""))的單元格
類似的函數還有一個COUNTBLANK,即隻統計指定區間内單元格為空值的個數
問題2:提取全部總成績的最大值、最小值,以及華山派總成績的最大值、最小值
最大值=MAX(I2:I19)
最小值=MIN(I1:I19)
MAX(number1, [number2], ...) 函如其名,傳回一組值中的最大值,最多255個參數,和sum函數參數個數一樣
參數可以是數字或者是包含數字的名稱、數組或引用。
例如:把總成績列命名為總成績
然後MAX的參數直接引用總成績=MAX(總成績)
結果一樣
邏輯值和直接鍵入到參數清單中代表數字的文本被計算在内。
如果參數是一個數組或引用,則隻使用其中的數字,數組或引用中的空白單元格、邏輯值或文本将被忽略。
比如把嶽靈珊的成績改成文本“我想你”,則MAX計算過程自動忽略這個文本
如果參數不包含任何數字,則 MAX 傳回 0,比如以姓名列作為MAX的參數
如果參數為錯誤值或為不能轉換為數字的文本,将會導緻錯誤
比如把嶽靈珊成績改為#N/A錯誤,則函數傳回錯誤
MIN的函數用法同MAX一樣,隻是取最小而已
各門派總成績的最大值=MAXIFS(I:I,C:C,K2)
各門派總成績的最小值=MINIFS(I:I,C:C,K2)
MAXIFS(max_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...)
這個函數用法同SUMIFS類似,MAXIFS傳回一組給定條件或标準指定的單元格中的最大值,
MINIFS則傳回一組給定條件或标準指定的單元格中的最小值
問題3:按總成績分數多少進行排名
公式如下:
=RANK(I2,I:I,0) | =RANK.EQ(I2,I:I,0) | =RANK.AVG(I2,I:I,0) |
我們可以看到,一共有三個排名函數,rank,rank.eq,rank.avg
其中RANK函數最初的時候隻有一個,後面兩個是從第一個函數進行拆分而來的,RANK.EQ與RANK是全繼承關系,也就是功能完全一樣,是以我們這裡隻介紹後面兩個就可以
RANK.EQ(number,ref,[order]) rank英文是排序的意思,EQ是單詞equal相等的縮寫,這個函數傳回一列數字的數字排位,其大小與清單中其他值相關;如果多個值具有相同的排位,則傳回該組值的最高排位,也就說比如兩個人并列第一名,則兩個人的排名都是第1,後面直接從第3名往下接,而RANK.AVG的排法在這裡會把兩個人都弄成1.5名,即(1+2)/2 =1.5 名,如果是三個人并列第一,則是(1+2+3)/3=2名
第一個參數是要找到排位的數字,這裡面即是每個人的總成績單元格
第二個參數是第一個參數所在清單的區域,Ref是單詞reference引用的縮寫
第三個參數是排序類型,預設或者填0為倒序,其他數字都是升序排列
RANK.AVG函數參數與RANK.EQ相同
如果把第三參數改為1,則變升序排列
問題4:分别求出各門派的人數,各門派性别為男的人數
各門派的人數=COUNTIFS(C:C,K2)
各門派性别為男的人數=COUNTIFS(C:C,K2,B:B,"男")
其實還是有COUNTIF這個條件函數的,個人建議直接PASS掉這個COUNTIF
COUNTIFS(criteria_range1, criteria1, [criteria_range2, criteria2],…)
用法和SUMIFS,MAXIFS函數都類似,這個函數傳回統計滿足所有條件的次數
最少兩個條件,第一個是條件區域,第二個是條件,可以使用通配符進行比對
問題5:求出所有成績的平均值,以及求出按門派分類總成績的平均值
=AVERAGE(I1:I19) 或者 =AVERAGE(總成績)(前面已經定義列區域名稱)
AVERAGE(number1, [number2], ...) 單詞本身就是平均值的意思,函如其名,傳回參數平均值
這個函數隻計算裡面是數值的平均值,比如在最下面加一個文本我想你,則不計算
這個函數也不計算布爾值,如果要計算文本單元格在内的所有單元格平均值則要用=AVERAGEA(I1:I20)
AVERAGEA 比AVERAGE函數多了一個字母,A代表ALL的意思
求出按門派分類總成績的平均值=AVERAGEIFS(I:I,C:C,K2)
問題6:求出總成績在90%分位上的值,以及求出每個人成績排名的分位值
求出總成績在90%分位上的值:=PERCENTILE(I2:I19,0.9)
這個實際意義就是說隻要成績超過614.9分,就可以超過成績單裡面90%的人了
PERCENTILE(array,k),percentile單詞的意思是百分位數,也就是指排在某個百分比位數的值是多少
這個函數可以決定檢查得分高于第某個百分點的候選人。
第一個參數是定義相對位置的數組或資料區域。
第二個參數0到1之間的百分點值,包含 0 和 1。
後面又衍生分裂為兩個新函數,percentile.inc 和 percentile.exc, inc是include的縮寫,exc是exclude縮寫
percentile.inc完整地繼承了percentile函數功能,percentile.exc,函數的第二個參數不能為0或者100%
例:考多少分可以超過100%(也就是最高分)的人:=PERCENTILE(I2:I19,1)
但是如果用:=PERCENTILE.EXC(I2:I19,1)就會報錯
求出每個人成績排名的分位值:=PERCENTRANK.INC($I$2:$I$19,I2)
這個函數也有.exc的變體:=PERCENTRANK.EXC($I$2:$I$19,I2)這裡排名百位分沒有了1和0的值
我們以前者為準,這個百分位排名函數也可以用rank間接計算出來
=(K2-1)/(COUNT($K$2:$K$19)-1)
略有一點差異,影響不大
PERCENTRANK.INC(array,x,[significance]),percent是百分比,rank是排名,即百分比排名函數,将某個數值在資料集中的排位作為資料集的百分比值傳回,此處的百分比值的範圍為0 到1(含 0 和 1)。
第一個參數是定義相對位置的數值數組或數值資料區域
第二個參數是需要得到其排位的值
第三個參數可選。 用于辨別傳回的百分比值的有效位數的值,如果省略,則PERCENTRANK.INC使用 3 位小數
附加:Excel篩選條件下進行求和,計數,最大值,最小值
先篩選部門華山派,然後在最下方單元格輸入公式=SUBTOTAL(9,I2:I19)即可求出篩選狀态下的和
如果用SUM公式求和,則會傳回所有單元格包括沒篩選部分的成績之和
SUBTOTAL(function_num,ref1,[ref2],...)
第一個參數是函數類型,輸入數字 1-11 或 101-111,用于指定要為分類彙總使用的函數。 如果使用 1-11,将包括手動隐藏的行,如果使用 101-111,則排除手動隐藏的行;始終排除已篩選掉的單元格。
Function_num (包括隐藏的行) | Function_num (忽略隐藏的行) | 函數 |
1 | 101 | AVERAGE |
2 | 102 | COUNT |
3 | 103 | COUNTA |
4 | 104 | MAX |
5 | 105 | MIN |
6 | 106 | PRODUCT |
7 | 107 | STDEV |
8 | 108 | STDEVP |
9 | 109 | SUM |
10 | 110 | VAR |
11 | 111 | VARP |
第二個參數是引用的資料區域
例:我們篩選華山派求和人數=SUBTOTAL(2,I2:I19)
此時我們将令狐沖和嶽靈珊兩個人手動隐藏(非篩選隐藏)
此時我們得到的值裡不包括隐藏項,是以這個第一參數官方文檔說明是不是有些問題?
其他的一些功能:求最大值
求所有值相乘
Python實作:
問題1:提取成績單表格裡是數值的單元格個數,和非空的單元格總的個數
統計非空的單元格總的個數:
import pandas as pd
df = pd.read_excel("c:/study_note/xiao_subtotal.xlsx",sheet_name = "成績單")
df.count().sum()+df.shape[1]
因為pandas通過count函數并不統計第一行,列首是作為列索引字段的
統計表格裡是數值的單元格個數:
df.iloc[:,[4,5,6,7,8]].count().sum()
或者
df.loc[:,"國文":"總成績"].count().sum()
問題2:提取全部總成績的最大值、最小值,以及華山派總成績的最大值、最小值
df["總成績"].max()
df["總成績"].min()
df.groupby("部門")["總成績"].max()["華山派"]
df.groupby("部門")["總成績"].min()["華山派"]
問題3:按總成績分數多少進行排名
倒序排名:
df["總成績提名"] =df["總成績"].rank(ascending= False,method="min")
相同名次下平均取值:
df["總成績提名"] =df["總成績"].rank(ascending= False,method="average")
升序排列
df["總成績提名"] =df["總成績"].rank(ascending= True,method="min")
問題4:分别求出各門派的人數,各門派性别為男的人數
df.groupby("部門")["部門"].count()
df[df["性别"] == "男"].groupby("部門")["部門"].count()
或者用個麻煩點的方法:
a = df.groupby(["部門","性别"]).count()
a = a.reset_index().set_index(["性别","部門"])
a["姓名"].loc["男",:]
問題5:求出所有成績的平均值,以及求出按門派分類總成績的平均值
df["總成績"].mean()
df.groupby("部門")["總成績"].mean()
問題6:求出總成績在90%分位上的值,以及求出每個人成績排名的分位值
df["總成績"].quantile(0.9)
quantile的單詞是分位點的意思
求出每個人成績排名的分位值:
df["成績排名"]= df["總成績"].rank(ascending = True, method="min")
df["百分位排名"] = (df["成績排名"]-1)/(df["總成績"].count()-1)
SQL實作:
1提取成績單表格裡是數值的單元格個數,和非空的單元格總的個數
SELECT count(姓名) +count(性别)+ count(部門)+count(籍貫)+count(國文)+count(數學)+count(綜合)+count(英語)
+count(總成績) AS "單元格數" FROM score ;
這個是不包括列首的單元格數,隻要再此基礎上加字段數即可
提取成績單表格裡是數值的單元格個數
SELECT count(國文)+count(數學)+count(綜合)+count(英語)+count(總成績) AS "單元格數" FROM score ;
問題2:提取全部總成績的最大值、最小值,以及華山派總成績的最大值、最小值
SELECT max(總成績) AS "最大值" FROM score ;
SELECT min(總成績) AS "最大值" FROM score ;
SELECT max(總成績) AS "最大值" FROM score WHERE 部門='華山派' ;
SELECT min(總成績) AS "最大值" FROM score WHERE 部門='華山派';
問題3:按總成績分數多少進行排名
降序排名:
SELECT *,rank() OVER (ORDER BY 總成績 DESC) AS "分數排名" FROM score;
升序排名:
SELECT *,rank() OVER (ORDER BY 總成績) AS "分數排名" FROM score;
其中SQL排名還有兩種:
SELECT *,ROW_NUMBER() OVER (ORDER BY 總成績 DESC) AS "分數排名" FROM score;
這種排名兩個值相同時,并不會顯示兩個相同的并列名次,而是依然按順序号進行往下排
比如把平一指的成績也改為608:
UPDATE score SET 總成績 = '608' WHERE 姓名='平一指';
可以看到第4名和第5名的成績是一樣的,但是還是按順序進行排序
SELECT *,DENSE_RANK() OVER (ORDER BY 總成績 DESC) AS "分數排名" FROM score;
這種形式出現兩個并列排名後面依然會按順序進行往下排,比如兩個并列第4名,後面依舊接第5名
問題4:分别求出各門派的人數,各門派性别為男的人數
SELECT 部門,count(姓名) AS 部門人數 FROM score GROUP BY 部門;
SELECT 部門,count(姓名) AS 部門人數 FROM score WHERE 性别 ='男' GROUP BY 部門 ;
問題5:求出所有成績的平均值,以及求出按門派分類總成績的平均值
SELECT avg(總成績) AS 平均值 FROM score ;
SELECT 部門,avg(總成績) AS 平均值 FROM score GROUP BY 部門;
問題6:求出總成績在90%分位上的值,以及求出每個人成績排名的分位值
第一個問題沒找到解決辦法,後面找到再補
求出每個人成績排名的分位值:
CREATE TABLE temp4(
姓名 VARCHAR(10),
排名 INT
);
INSERT INTO temp4 SELECT 姓名,rank() OVER (ORDER BY 總成績 ) AS 排名 FROM score;
SELECT 姓名,(排名-1)/17 AS 百分位排名 FROM temp4 ORDER BY 百分位排名 DESC;
Tableau實作:
問題1:提取成績單表格裡是數值的單元格個數,和非空的單元格總的個數
可以像SQL一樣用COUNT函數求出,這裡沒必要用Tableau來實作,焉用牛刀?
問題2:提取全部總成績的最大值、最小值,以及華山派總成績的最大值、最小值
把總成績字段移到文本上面,然後點小三角下拉清單,找到最大值和最小值
把總成績字段再複制一個,然後篩選為顯示最小值,把這兩個字段同時拖到左下角路徑成本裡面,如下:
問題3:按總成績分數多少進行排名
建立成績排名字段,輸入公式RANK(SUM([總成績]),'desc')
然後将成績排名字段拖到左下角路徑成本裡面
問題4:分别求出各門派的人數,各門派性别為男的人數
一個取巧的辦法,把部門拖到行空格裡,然後把姓名拖到标記裡面的詳細資訊,可以看到一個小方塊代表一個人
或者把姓名拖到文本裡,顯示每個門派包括哪些人,
以上兩個方法都不能直接計數,正确方法如下:
建立計算字段,命名為部門人數,輸入公式COUNT([部門])
把部門人數字段拖到文本上面即可求出各門派的人數
把性别字段拖到篩選器下面,然後篩選性别為男,即可求出各門派性别為男的人數
問題5:求出所有成績的平均值,以及求出按門派分類總成績的平均值
直接在字段總成績上面篩選度量-平均值就可以,拖到文本上面
把部門字段拖到行空格處,即可顯示各部門平均值
問題6:求出總成績在90%分位上的值,以及求出每個人成績排名的分位值
直接篩選總成績字段-度量-百分位-90即可得到在90%分位上的值
建立計算字段百分位數,輸入公式:RANK_PERCENTILE(SUM([總成績]),'asc')
然後将字段拖到左下角度量那裡即可
覺得有用點個贊,一起交流一起學習!