数据分析:数据处理篇1
數據的寫入與讀取
- 數據的寫入
- .csv文件寫入
- .xlsx文件寫入
- 數據的讀取
- .csv文件讀取
- .xlsx文件讀取
- 數據的使用
- 隨機獲取信息
- 數據去重
在做數據分析的時候,Excel表格是一個常用的工具,但是當數據文件數據量比較大時,Excel光是打開文件就需要花費很長的時間。此時,利用pandas就會變得非常高效。因此,本文將討論利用pandas讀取以及寫入Excel。
數據的寫入
之前的課程中,我們了解了pycharm可以將數據寫入Excel和csv。其實,支持寫入的文件格式還有HTML、JSON。
csv是最為常見的以純文本文件存儲數據文件的格式,它的優點是通用性很強,不受操作系統以及具體的軟件的限制;Excel是一種非常常見的數據表格,因此本文也要介紹。
.csv文件寫入
DataFrame格式的內容想要寫入csv文件非常容易,只需要一個to_csv方法即可,而這個方法又是DataFrame自帶的,不需要單獨引用。下面給大家舉例。
import pandas as pd dic = {'ID':[1001,1002,1003,1001,1004,1005,1006,1004,1007,1008],'name':['張三','李四','王五','張三','趙六','孫七','周八','趙六','吳九','鄭十'],'age':['18','19','30','18','20','22','25','20','21','16'],'high':['150.00','167.00','180.00','150.00','160.00','165.00','168.00','160.00','172.00','178.00'],'sex':['男','女','男','男','女','男','男','女','女','男']} df=pd.DataFrame(data = dic,index = ['a','b','c','d','e','f','g','h','i','j']) # 以下內容為寫入csv文件 df.to_csv(path_or_buf='./People_Information.csv', encoding='utf_8_sig') print('end')其中,’./People_Information.csv’意思為新建名稱為People_Information,保存路徑為當前目錄。如果我們想要保存到其他路徑,可以在此電腦中打開要保存到的文件夾,復制路徑,粘貼到這里的“./”前面并將’ \ ‘改為’/'即可。encoding='utf_8_sig’是規定編碼方式為UTF-8。如果不做此設置,當我們打開文件時就會看到亂碼,感興趣的小伙伴可以自行嘗試。
看看運行結果:
我們在當前目錄文件下找到了csv文件,并且內容和輸出結果一樣。如果不希望在生成的csv文件中存儲index中的索引信息,可以將其設置為false:
這個方法中還有很多默認參數,需要實現不同功能是可以查看不同參數。注意要選擇DataFrame類下的to_csv方法哦!
熟悉Excel的小伙伴們應該發現了,csv相當于是閹割版的Excel了,它只有一個sheet表,并且命名就是文件名。那么我們如何把DataFrame的數據存到Excel呢?
.xlsx文件寫入
ExcelWriter是pandas下的一個方法,它可以在指定路徑下創建一個.xlsx文件,并將其命名。運行一下試試看:
import pandas as pd pd.ExcelWriter("D:./test.xlsx")可以看到,我們已經在指定路徑創建了一個test.xlsx文件了,只是無法打開。接下來我們繼續為他填入數據,這個工作使用的方法是to_excel(excel_writer,sheet_name),需要把內容填到新建的.xlsx文件的指定工作表中,并將工作表進行命名。如果沒給sheet_name參數賦值,系統會自動賦值為Sheet1。下面我們測試一下:
from pandas import Series,DataFrame import pandas as pd dic1 = {'ID':[1001,1002,1003,1001,1004,1005,1006,1004,1007,1008],'name':['張三','李四','王五','張三','趙六','孫七','周八','趙六','吳九','鄭十'],'age':['18','19','30','18','20','22','25','20','21','16'],} dic2 = {'high':['150.00','167.00','180.00','150.00','160.00','165.00','168.00','160.00','172.00','178.00'],'sex':['男','女','男','男','女','男','男','女','女','男']} df1=pd.DataFrame(data = dic1,index = ['a','b','c','d','e','f','g','h','i','j']) df2=pd.DataFrame(data = dic2,index = ['a','b','c','d','e','f','g','h','i','j']) writer = pd.ExcelWriter("scores3.xlsx") df1.to_excel(writer, "sh1") df2.to_excel(writer) writer.save()看看運行結果:
數據的讀取
以上我們介紹了數據存儲到.csv文件和.xlsx文件,相信大家已經學會了如何寫入數據了。下面我們就來學習如何讀取數據。
.csv文件讀取
我們以剛剛寫好的兩個文件做例子來研究如何讀取數據。首先,想要讀取.csv文件就需要使用pandas下的read_csv方法,直接上結果:
import pandas as pd df = pd.read_csv('People_Information.csv') print(df) print(df.shape) # 顯示輸出端表格行列數看看結果:
當然,有些時候表格會出現一些我們不喜歡的問題,比如第一行本來應該是行索引,但實際是亂碼,如:
這時,如果我們還想顯示剛才的結果,就需要讓代碼從第2行開始顯示,做以下改動:
改動之后在運行程序,運行結果應該和剛才一樣,這里就不展示圖片了。
當然,如果.csv文件沒有列索引,我們可以把header設置為none,讓終端輸出標簽索引。
.xlsx文件讀取
.xlsx文件的讀取需要指定要讀取的工作表,因此其讀取的代碼寫成這樣:
from pandas import Series,DataFrame import pandas as pd df = pd.read_excel('scores3.xlsx',sheet_name='Sheet1') # df = df.loc[:, ~df.columns.str.contains('^Unnamed')] print(df)我們先來看看結果:
結果雖然是對的,但是有一個Unnamed破壞了陣型,導致讀取的數據和實際想要的數據維度不匹配,想要刪掉它,可以把上述屏蔽掉的代碼加上。
實際上,sheet_name也是一個默認參數,如果我們不修改其值,他會自動輸出第一個工作表的內容,大家可以試試看。
數據的使用
下面我們家是一個實際的場景,來應用數據讀取。
隨機獲取信息
我們依然使用剛剛建立的Excel表格做例子。現在,我們需要在所有人中隨機抽取三個進行點名:
from pandas import DataFrame import pandas as pd import random df = pd.read_excel('scores3.xlsx',sheet_name='sh1') df = df.loc[:,'name'] index_list = df.index.tolist() # 獲取df的行索引并存儲為列表 for i in range(0,3):value = index_list[random.randint(0,len(index_list)-1)]# 從0到列表長度-1的數中抽取隨機數,如果不-1有可能會發生溢出msg = df.iloc[value]print(msg)我暈醒了很多次,找到了一組有問題的輸出:
盡管這個表格中有重復的數據,但是周八是獨一無二的,這就是說隨機取值是有放回抽樣。如果一直運行下去,就會出現兩個張三,或者三個趙六之類的現象,下面我們講述如何避免這樣的問題。
數據去重
列表中的數據有重復是一個比較煩人的現象。但是想解決這個問題也并不麻煩,我們可以將指定列轉化為列表,然后進行列表去重:
from pandas import DataFrame import pandas as pd import random df = pd.read_excel('scores3.xlsx',sheet_name='sh1') val=df['name'].tolist() # 獲取姓名,并轉成list print(val) num = set(val) # 去重 print(num,'\n',len(num))這樣一番操作下來,沒有重復數據的num就是一個set類型的數據了。如果需要的話可以使用list()強轉為列表:
可以看到,我們已經去掉了重復的名字。下面我們填之前的坑,讓輸出的隨機人員不重復:
大家可以多試幾次,檢查一下。提示:可以加入計數器查看循環的次數。
如何去除真正重復的元素
上文我們討論的去重,是依據某一列元素是否重復的去重,但是實際上,某一列的數據不足以代表數據是否重復,比如我現在對表格做一個修改:
盡管兩個張三的名字和年齡一樣,但ID是不同的,因此我們需要去充的時候把兩個都留下來。這樣的要求set()函數就不好幫我們處理了,我們可以手動寫一段代碼來判斷重復與否:
from pandas import DataFrame import pandas as pd import random cont=[] F=1 df = pd.read_excel('scores3.xlsx',sheet_name='sh1') for i in range(len(df.index.tolist())):# 注:range函數生成的數組末位即為len(df.index.tolist())-1,因此不需要額外-1val=df.loc[i,].tolist() # 獲取姓名,并轉成listfor j in range(len(cont)):if cont[j]==val:F=0 # 標記重復breakif F==1:cont.append(val)else:F=1 print('去重后元素數量為:%d'%len(cont)) df=DataFrame(cont,columns = ['ID','name','age']) print(df)運行測試一下:
本文給大家分享了pandas對.csv文件和.xlsx文件進行讀寫的操作,以及模擬了現實中可能會出現的一些場景,下次會繼續給大家帶來數據刪除、空值處理等內容,喜歡的小伙伴關注一下吧~
總結
以上是生活随笔為你收集整理的数据分析:数据处理篇1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关闭PyCharm的Run with P
- 下一篇: 顺序查找与二分查找时间复杂度的比较