【python】python vs Excel ( 如何通過loc與iloc函數處理Excel數據)


一,loc函數及iloc函數的使用及區別

Pandas中的loc和iloc兩個函數的用法基本相同。iloc與之不同的是它讀取數據使用行索引跟列索引來對數據進行定位選取。而loc函數可以通過行名跟列名來對數據進行選取。也就是字符串或者字母。另外對於索引方面,雖然loc方法中也支持對行,列使用Int類型做篩選跟切片。但是這個是與iloc有所不同的是在loc中的0:2是真的代表把索引為0:2的數據選取出來。而iloc中的0:2則選取的內容中不包括2.最多取到1。在這一點上一定要注意其中的區別。

二,loc函數於iloc函數使用對比

1. 對單元格進行取值

注釋:loc在取值時0代表行號,因為在沒有指定行號的情況下默認是數字0開始分配的。逗號之后代表列名

          iloc在取值時逗號前的0跟loc相同也是行索引,而后面取值用的是列的索引值而不能是列名

 1 #%%
 2 
 3 import pandas as pd
 4 
 5 df = pd.read_excel(R"C:\Users\Administrator\PycharmProjects\python_Basic\Pandas_to_Excel\20200727\student_info.xlsx",
 6                    sheet_name=0)
 7 
 8 df.head(3)
 9 #%%
10 loc01 = df.loc[0,"姓名"]
11 loc01
12 #%%
13 iloc01 = df.iloc[0,1]
14 iloc01

 

 2. 讀取行數據

注釋:loc取值時候可以通過切片的方式取值0:0代表只去當前這第一列

           iloc取值時對比loc唯一不同的是雖然也只是對行索引進行操作。但是切片后面的值位1而不是0因為如果是0的話,默認取值取到的是二維數組的表頭也就是列名

#%%
loc02 = df.loc[0:0]
loc02

#%%
iloc02 = df.iloc[0:1]
iloc02

 3. 讀取所選指定范圍的數據

需求:讀取姓名和總分前4行的數據

注釋:這里兩者逗號前都是使用了切片的方式指定行數據,而逗號后面則是通過列表指定列名的方式來讀取的。當然iloc是通過列索引來讀取的。

#%%
loc03 = df.loc[0:3,["姓名","總分"]]
loc03


#%%

iloc03 = df.iloc[0:4,[1,5]]
iloc03

4. 通過切片來讀取數據

注釋:在前面的案例中其實已經使用了切片的方式,這里再來鞏固一下。這里要注意的是,在逗號前的行索引切片中我使用了步長。也就是第二個分好的2,意思代表每隔1行進行讀取。

           對比iloc而言loc對於列的讀取可以指定列名,這樣在可讀性方面大大優於Iloc。iloc1:6誰知道1:6是個什么鬼。還要一個個去數下標實在麻煩。所以不同場景不同使用看個人愛好。

iloc03 = df.iloc[0:4,[1,5]]
iloc03

#%%
loc04 = df.loc[0:10:2,"姓名":"總分"]
loc04
#%%
iloc04 = df.iloc[0:11:2,1:6]
iloc04

5. 通過mask掩碼對數據進行選取

需求:選出語文成績大於80分的所有成員信息

注釋:對於mask掩碼,返回的是以True,False為值的布爾類型。有多少數據就返回多少個值。這里要強調的是建議使用loc來操作mask掩碼也是最方便的。而iloc因為在下面的案例中我個人沒能很好的演示成功也覺得麻煩,所以不展示iloc的結果了。感興趣的可以自己測試。測試過程中少些幾個數據。。。

#%%

loc05 = df.loc[df["語文"]>80]
loc05

#%%
df["語文"]>80

 需求2:篩選出班級2中,數學,語文,英語都大於80分的女生。

注釋:通過mask掩碼的運用。我們可以直接給條件判斷,條件成立則把數據篩選出來。這樣做的好處在於不用再使用循環取值,可以大大節省IO的消耗。

df = pd.read_excel(R"C:\Users\Administrator\PycharmProjects\python_Basic\Pandas_to_Excel\20200727\student_info.xlsx",
                   sheet_name=1)
df[(df["語文"]>80) & (df["數學"]>80) & (df["英語"]>80) & (df["性別"]=="")]

三,綜合案例演示

需求:student_info.xlsx這個表格中有5個班級的信息,分別通過5個sheet來保存的。當我們通過pandas來讀取Excel的所有內容時必須指定sheet_name=None.但是如果設定為None,那么讀取后的數據不在是一個DataFrame而是一個dict字典。那么如何把讀取到的dict中的值,作為一個sheet重新保存到另外一個Excel中呢?這就是這個案例的價值。當然如果您的每個sheets中的內容過大,不建議合並成一個sheet。因為這樣

在數據打開時直接導致內存消耗而打不開文件。另外轉成一個sheet的好處就是當我們讀取的時候不在是dict而是DataFrame格式,這樣我們在篩選數據的時候可以直接調用DataFrame的方法而不是dict的方法。

#%%

df = pd.read_excel(R"C:\Users\Administrator\PycharmProjects\python_Basic\Pandas_to_Excel\20200727\student_info.xlsx",
                   sheet_name=None)
keys = list(df.keys()) #獲取所有的sheet名的列表

#把所有sheet中的內容合並成一個sheet(數據量大的時候不推薦使用)
data_concat = pd.DataFrame()
for i in keys:
    item = df[i]
    data_concat = pd.concat([data_concat,item])
print(data_concat)
data_concat.to_excel(R"C:\Users\Administrator\PycharmProjects\python_Basic\Pandas_to_Excel\20200727\student_info_concat.xlsx",
                     index=False)
print("Done!")

#%%
df = pd.read_excel(R"C:\Users\Administrator\PycharmProjects\python_Basic\Pandas_to_Excel\20200727\student_info_concat.xlsx")
loc06=df.loc[(df["班級"]==1) | (df["班級"]==2) & (df["語文"]>60) & (df["數學"]>60) & (df["英語"]>60) ]
loc06
#%%

從演示效果來看是不是覺得作為DataFrame來讀取表格數據比直接通過循環獲取list,dict,set中的數據來的方便呀。所以應用好每個類,函數的技巧會給我們的日常工作帶來更大的便利!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM