











import numpy as np import pandas as pd # 聚合函數 df_index = ["Tony", "Alex", "Jack", "Mary", "Kelly"] df_columns = ["語文", "數學", "英語", "物理"] df = pd.DataFrame(data=np.random.randint(50,100,size=(5,4)), index=df_index, columns=df_columns) print(df) # 列方向求和 print(df.sum()) # 求每列即每科目分數的總和 print(df.mean()) # 求每列即每科目分數的平均值 # 行方向求和 print(df.sum(axis=1)) # 求每位同學分數的總和 print(df.mean(axis=1)) # 求每位同學分數的平均值 # 求所有行列元素的和 print("df對象所有行列元素的和為:", end="") print(df.sum().sum()) # pandas中空值會被忽略 df.loc["Alex", "物理"] = np.nan print(df) print(df.sum())
歸類、梳理後代碼如下:
import numpy as np import pandas as pd # 聚合函數 df_index = ["Tony", "Alex", "Jack", "Mary", "Kelly"] df_columns = ["語文", "數學", "英語", "物理"] df = pd.DataFrame(data=np.random.randint(50,100,size=(5,4)), index=df_index, columns=df_columns) # 設置一個空值,看聚合函數對空值的處理方式 df.loc["Jack", "物理"] = np.nan print("=====初識成績表(帶空值)=====") print(df) # ============================================== # 一、【最常用】統計聚合函數(默認 axis=0:按列統計) # ============================================== print("\n=====1、每科統計(列方向)=====") print("每科總分:") print(df.sum()) # 求每科(列)和,自動跳過(忽略)NaN print("\n每科平均分:") print(df.mean()) # 求每科(列)平均值,自動跳過(忽略)NaN print("\n每科最高分:") print(df.max()) # 求每科(列)最大值 print("\n每科最低分:") print(df.min()) # 求每科(列)最小值,自動跳過(忽略)NaN print("\n每科中位數(中間分數):") print(df.median()) # 求每科(列)中位數 print("\n每科標準差(分數波動情況):") print(df.std()) # 每科標準差,越大越不穩定,自動跳過(忽略)NaN print("\n每科非空人數:") print(df.count()) # 每科非空人數 # ============================================== # 二、按行聚合(每個學生),( axis=1:按行統計) # ============================================== print("\n=====2、每個學生統計(行方向)=====") print("每個學生的總分:") print(df.sum(axis=1)) # 求每行的數據總和,即每個學生的總分,自動跳過(忽略)NaN print("\n每個學生的平均分:") print(df.mean(axis=1)) print("\n每個學生的最高分:") print(df.max(axis=1)) print("\n每個學生分數中位數(中間分數):") print(df.median(axis=1)) print("\n每個學生分數標準差(分數波動情況):") print(df.std(axis=1)) # 標準差越大這個學生各科分數越不穩定,自動跳過(忽略)NaN # ============================================== # 三、全局聚合 # ============================================== print("\n=====3、全局統計(整個表格)=====") print("所有學生全科總分:", df.sum().sum()) print("全班所有科目平均分:", df.mean().mean()) print("全班最高分:", df.max().max()) print("全班最低分:", df.min().min()) print("全班中位數(中間分數):", df.median().median()) print("全班標準差(分數波動情況):", df.std().std()) print("全班非空人數:", df.count().sum()) # ============================================= # 四、重要擴展idxmax()、idxmin()——最大最小值對應的行標籤 # ============================================= print("\n=====4、使用擴展=====") print("語文最高分是:", df["語文"].idxmax()) print("英語最低分是:", df["英語"].idxmin()) print("Tony同學的最高分科目是:", df.loc["Tony"].idxmax())
習題:
# 班級有張三、李四、王五、趙六四位同學,考試科目有Python、Java、C三門 # 1、假設score1是期中考試成績,score2是期末考試成績,請自由創建score1和score2,並將其相加,求期中期末平均值 # 2、假設張三期中考試Java作弊,要記為0分,如何實現? # 3、李四因為舉報張三作弊立功,其期中考試所有科目加10分,如何實現? # 4、由於有一道題出錯,要給所有學生加10分,如何實現? # 5、Python老師想知道哪些同學Java成績比Python好,如何實現? import numpy as np import pandas as pd student_list = ["張三", "李四", "王五", "趙六"] subject_list = ["Python", "Java", "C"] score1 = pd.DataFrame( data=[ [78, 72, 58], [89, 87, 77], [87, 91, 76], [93, 95, 98] ], index=student_list, columns=subject_list ) print("=====初始期中考試成績表=====") print(score1) print("=====初始期中考試各科平均分=====") print(score1.mean()) print("=====初始期中考試各學生平均分=====") print(score1.mean(axis=1)) score2 = pd.DataFrame( data=[ [85, 91, 83], [81, 72, 66], [83, 88, 79], [91, 93, 96] ], index=student_list, columns=subject_list ) print("=====期末考試成績表=====") print(score2) print("=====期末考試各科平均分=====") print(score2.mean()) print("=====期末考試各學生平均分=====") print(score2.mean(axis=1)) print("=====初始期中和期末考試成績總和表=====") print(score1+score2) print("=====張三期中考試Java作弊,記為0分=====") score1.loc["張三", "Java"] = 0 print("=====李四舉報作弊期中考試各科加分=====") score1.loc["李四"] += 10 # 如果加分後超滿分,則設為100分 score1.loc["李四"] = score1.loc["李四"].mask(score1.loc["李四"] > 100, 100) print("=====由於有一道題出錯,期中考試所有學生各科加分10分=====") score1 = score1 + 10 # 如果加分後超滿分,則設為100分 score1 = score1.mask(score1 > 100, 100) print("=====最終期中考試成績表=====") print(score1) print("=====最終期中考試各科平均分=====") print(score1.mean()) print("=====最終期中考試各學生平均分=====") print(score1.mean(axis=1)) print("=====最終期中和期末考試成績總和表=====") print((score1+score2)/2) print("=====期中考試Java成績比Python好的同學名單=====") condition = score1["Java"] > score1["Python"] print(score1[condition].index.tolist()) print("=====期末考試Java成績比Python好的同學名單=====") condition = score2["Java"] > score2["Python"] print(score2[condition].index.tolist()) # 理解上容易繞,與對象["列索引"]訪問的是列不同,這裡篩選的還是行 print(score2.loc[condition].index.tolist()) # 推薦使用loc[]訪問行
*單層索引
import numpy as np import pandas as pd df = pd.DataFrame(data=np.random.randint(0,20,size=(5,3)), columns=list("ABC")) print(df) print(df.index) # 行索引 print(df.columns) # 列索引 print(df.index.tolist()) # 行索引的列表形式 print(df.columns.tolist()) # 列索引的列表形式 # 行列索引的修改、設置 # 常規方法 df.index = list("PQRST") df.columns = ["maths", "english", "physics"] print(df) # 定製方法 # 先通過Index\RangeIndex\DateTimeIndex\etc...創建一個索引對象 index1 = pd.Index(data=["haha", "hehe", "oooo", "lala", "uuuu"], name="SSSS") index2 = pd.RangeIndex(0,10,2,name="numberssss") # 再傳遞給df.index df.index = index1 print(df) df.index = index2 print(df)
*多層索引
# 多層索引 # 列索引的多層 LEVEL1 = ["第一期", "第二期"] LEVEL2 = ["A", "B", "C"] columns = pd.MultiIndex.from_product([LEVEL1, LEVEL2], names=["期數", "產品"]) index = ["lucy", "tom", "alex"] # 上行列索引當然也可以通過如下Index設置 # index = pd.Index(data=["lucy", "tom", "alex"], name="姓名") data = np.random.randint(0, 100, size=(3,6)) df = pd.DataFrame(data=data, index=index,columns=columns) print(df) # 行索引的多層 group = ["Group1", "Group2"] sales = ["Anna", "Lisa", "Mina", "Fiona"] index = pd.MultiIndex.from_product([group, sales], names=["Groups", "Sales"]) columns = pd.Index(data=["A", "B", "C", "D", "E"], name="product") data = np.random.randint(0, 100, size=(8, 5)) df = pd.DataFrame(data=data, index=index, columns=columns) print(df)
習題:
創建一個DataFrame,表示出lucy,tom,jack本學期各科(python,java,c)成績;獲取lucy成績的最高分是哪門課。獲取tom的成績,計算tom各學科的平均成績。獲取jack的python成績,並加上20分。
import numpy as np import pandas as pd score_df = pd.DataFrame( data=np.random.randint(50,100,size=(3,3)), index=["Lucy", "Tom", "Jack"], columns=["Python", "Java", "C"] ) print("=====本學期成績表如下:=====") print(score_df) print("\n=====Lucy最高分科目如下:=====") print(score_df.loc["Lucy"].idxmax()) print("\n=====Tom各科成績如下:=====") print(score_df.loc["Tom"].to_dict()) print("\n=====Tom各科平均分為:=====") print(round(score_df.loc["Tom"].mean(),2)) print("\n=====Jack的Python成績為:=====") print(score_df.loc["Jack", "Python"]) print("\n=====給Jack的Python成績加上20分:=====") score_df.loc["Jack", "Python"] += 20 print(score_df)
此內容由慣性聚合(RSS閱讀器)自動聚合整理,僅供閱讀參考。 原文來自 — 版權歸原作者所有。