pandas玩Excel ---小白筆記2,感謝Timothy老師
一、多表查詢
原檔案是:
1.聯合查詢:查詢學生表對應的成績表的學生成績。
# *_*coding:utf-8 *_* # @Author : zyb import pandas as pd students = pd.read_excel('多表查詢.xlsx',sheet_name='學生表') scores = pd.read_excel('多表查詢.xlsx',sheet_name='成績表') exl = students.merge(scores,on='ID') print(exl)
效果:查出結果是保留了公有的資料
2.聯合查詢:查詢學生表對應的成績表的學生成績。保留學生表資料
# *_*coding:utf-8 *_* # @Author : zyb import pandas as pd students = pd.read_excel('多表查詢.xlsx',sheet_name='學生表') scores = pd.read_excel('多表查詢.xlsx',sheet_name='成績表') exl = students.merge(scores,how='left',on='ID') print(exl)
效果:
3.聯合查詢:查詢學生表對應的成績表的學生成績。保留學生表資料-->分數保留整數,沒有匹配到顯示0,on引數是兩個表都有這個列名就可以是用,如果不一樣就使用left_on=,right_on=
# *_*coding:utf-8 *_* # @Author : zyb import pandas as pd students = pd.read_excel('多表查詢.xlsx',sheet_name='學生表') scores = pd.read_excel('多表查詢.xlsx',sheet_name='成績表') exl = students.merge(scores,how='left',left_on='ID',right_on='ID').fillna(0) exl['分數'] = exl.分數.astype(int) print(exl)
效果:
4.以上1,2,3,是用的merge方法,現在看看用join:首先join要指定index_col。之後用how=引數控制是左連線how=‘left’還有右連線how=‘right’,還是取交集how='inner'
# *_*coding:utf-8 *_* # @Author : zyb import pandas as pd students = pd.read_excel('多表查詢.xlsx',sheet_name='學生表',index_col="ID") scores = pd.read_excel('多表查詢.xlsx',sheet_name='成績表',index_col="ID") exl_left = students.join(scores,how='left').fillna(0) exl_right = students.join(scores,how='right').fillna(0) exl_inner = students.join(scores,how='inner').fillna(0) # exl['分數'] = exl.分數.astype(int) print(exl_left) print(exl_right) print(exl_inner)
效果:
5.pandas對Excel資料校驗:滿分是100分的試卷
原檔案:
1.把不是0-100的分數打印出來,axis引數:0是按照列來,1是按照行來。如果顯示不齊,把print(f'{row.ID} exl{row.學生} 資料校驗0-100 {row.分數}')空格換成\t製表符就OK了
# *_*coding:utf-8 *_* # @Author : zyb import pandas as pd exl = pd.read_excel('資料校驗.xlsx') def fen_jiaoyao(row): try: assert 0<=row.分數<=100 except: print(f'{row.ID} exl{row.學生} 資料校驗0-100 {row.分數}') exl.apply(fen_jiaoyao,axis=1)
效果:
2.拆分資料:按照一定的條件把學生和分數分別拆分出來
# *_*coding:utf-8 *_* # @Author : zyb import pandas as pd exl = pd.read_excel('資料拆分.xlsx',index_col='ID') df = exl['學生\分數'].str.split(' ',n=2,expand=True) exl["學生"] = df[0] exl["分數"] = df[1] exl = exl.drop(['學生\分數'],axis=1) #刪除列 print(exl)
效果:
3.刪除行和列操作:
# *_*coding:utf-8 *_* # @Author : zyb import pandas as pd exl = pd.read_excel('資料拆分.xlsx',index_col='ID') df = exl['學生\分數'].str.split(' ',n=2,expand=True) exl["學生"] = df[0] exl["分數"] = df[1] exl = exl.drop(['學生\分數'],axis=1) #刪除列 exl = exl.drop([2,3]) print(exl)
效果:
二、資料統計:原資料
1.求加兩列每個同學的總分數和平均分數,加一行求每個科目的平均分數
# *_*coding:utf-8 *_* # @Author : zyb import pandas as pd exl = pd.read_excel('資料統計.xlsx',index_col='ID') #拿到三次考試的成績進行資料統計 shuju = exl[['語文','數學','英語']] #按行求和、求平均值 hang_sum = shuju.sum(axis=1) hang_mean = shuju.mean(axis=1) exl['總分數'] = hang_sum exl['平均分'] = hang_mean #按列求和、求平均值 # lie_sum = shuju.sum() lie_mean = shuju.mean() lie_mean["姓名"] = "平均數" lie_mean["總分數"] = "" lie_mean["平均分"] = "" exl=exl.append(lie_mean,ignore_index=True) print(exl)
效果:
2.在1的基礎上,如果想求總分數的平均值和平均值的平均值
# *_*coding:utf-8 *_* # @Author : zyb import pandas as pd exl = pd.read_excel('資料統計.xlsx',index_col='ID') #拿到三次考試的成績進行資料統計 shuju = exl[['語文','數學','英語']] #按行求和、求平均值 hang_sum = shuju.sum(axis=1) hang_mean = shuju.mean(axis=1) exl['總分數'] = hang_sum exl['平均分'] = hang_mean #按列求和、求平均值 # lie_sum = shuju.sum() # lie_mean = shuju.mean() lie_mean = exl[['語文','數學','英語','總分數','平均分']].mean() lie_mean["姓名"] = "平均數" # lie_mean["總分數"] = "" # lie_mean["平均分"] = "" exl=exl.append(lie_mean,ignore_index=True) print(exl)
效果:
3.pandas對Excel資料去重
原資料
1.去重資料,drop_duplicates函式,引數subset=用來指定按照那一列或者那幾列去重。多列傳list。引數keep=用來指定保留前面還是後面的資料。keep=‘first’預設的保留前面的資料,keep='last'保留後面的資料
# *_*coding:utf-8 *_* # @Author : zyb import pandas as pd exl = pd.read_excel('資料去重.xlsx') exl = exl.drop_duplicates(subset='姓名',keep='last') print(exl)
效果:
2.找出重複資料:
1.找出重複資料的索引
# *_*coding:utf-8 *_* # @Author : zyb import pandas as pd exl = pd.read_excel('資料去重.xlsx') dupe = exl.duplicated(subset='姓名') #找出重複資料 dupe = dupe[dupe==True]#簡寫是dupe = dupe[dupe] print(dupe) # 有重複資料顯示True # print(dupe.any())
效果是:
2.通過拿到這個索引來定位重複資料
# *_*coding:utf-8 *_* # @Author : zyb import pandas as pd exl = pd.read_excel('資料去重.xlsx') dupe = exl.duplicated(subset='姓名') #找出重複資料 dupe = dupe[dupe==True]#簡寫是dupe = dupe[dupe] exl_chong = exl.iloc[dupe.index] print(exl_chong)
效果: