1. 程式人生 > 實用技巧 >pandas玩Excel ---小白筆記2,感謝Timothy老師

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)

    效果: