如何優(yōu)雅地使用 pandas 對(duì)數(shù)據(jù)進(jìn)行整理-1 (數(shù)據(jù)類型介紹:變量蚤吹,列表舆瘪,字典臊岸,數(shù)據(jù)框)
為什么要學(xué)會(huì)使用 pandas 荔泳?
我覺得答案是:將數(shù)據(jù)結(jié)構(gòu)化蕉饼,以便更好地管理而 pandas 你可以理解為 利用代碼 實(shí)現(xiàn)你手動(dòng)對(duì) Excel 表格處理的功能
實(shí)際上,pandas 能實(shí)現(xiàn)的功能玛歌,基本在 Excel 上都能完成
兩個(gè)之間只是一個(gè) “時(shí)間效率” 和 “一勞永逸” 的事情
習(xí)慣用哪種是個(gè)人的一種選擇罷了
數(shù)據(jù)類型
在處理數(shù)據(jù)時(shí)昧港,首先我們得明白數(shù)據(jù)長(zhǎng)什么樣子,我們期望輸入的數(shù)據(jù)長(zhǎng)什么樣子支子。
這一塊的理解我其實(shí)并不太到位创肥,日后隨學(xué)習(xí)的深入再更。
在這里我們先說(shuō)明一些無(wú)關(guān)緊要的概念
Python 的基本數(shù)據(jù)類型 (我不知道專業(yè)的人是不是這么講)
- 變量 variable值朋,列表list叹侄,字典dict,數(shù)據(jù)框dataframe
- 這里只講 “他們是什么” 和 “怎么構(gòu)造”昨登,其他細(xì)節(jié)的操作以后有空再寫
變量:
這里的變量不是統(tǒng)計(jì)學(xué)的概念趾代,你可以將其理解為存儲(chǔ)某個(gè)數(shù)據(jù)的詞
-
需要注意的是,變量可以隨意命名丰辣,但是要按遵守以下規(guī)則:
- 變量名可以包括字母撒强,數(shù)字和下劃線 (_) ,(那就是說(shuō)笙什,其他奇怪的符號(hào)都不可以)
- 變量名不能以數(shù)字開頭飘哨。如:day1, day_1 是對(duì)的,1day 就不可以
- Python 里固有的函數(shù)琐凭、特殊含義字符芽隆,不能作為變量名。如:if, True 等。python 常見內(nèi)置函數(shù)
a = 2 ## 整數(shù)型數(shù)字變量
b = 3.56 ## 浮點(diǎn)型數(shù)字變量
one = 'John' ## 字符變量
r9A = True ## 布爾型變量
##### 需要注意的是
## 1. 變量名可以包括字母摆马,數(shù)字和下劃線 (_)
## 2. 變量名不能以數(shù)字開頭
- 但是臼闻,我們必須優(yōu)雅,所以囤采,以上的變量名都是不雅的示范
- 做了一名優(yōu)秀的程序員,應(yīng)該做到:看到變量名惩淳,就知道這個(gè)變量指代的是什么蕉毯,如果你一直以 a, b, c 等簡(jiǎn)單的命名,不用一個(gè)月思犁,兩三天后你就會(huì)忘記自己寫的是什么了代虾,這對(duì)于代碼的維護(hù)十分不利。
- 所以下面推薦兩個(gè)我感覺比較好用的優(yōu)雅命名法
- 下劃線續(xù)命激蹲,比如:
- A_num 棉磨,可以用來(lái)表示字符串中“A”的個(gè)數(shù)。
- diff_word_list学辱,可以用來(lái)表示一個(gè)“裝不同單詞”的列表
- 實(shí)際上乘瓤,用多少個(gè)下劃線(),用不用縮寫(num, diff)策泣,也是全憑個(gè)人習(xí)慣衙傀,在優(yōu)雅的同時(shí)得自己用的舒服。建議不要超過兩個(gè)下劃線()萨咕,太長(zhǎng)的話實(shí)在太難看了统抬,自己能看懂就行,能短就短危队。
-
駝峰命名法 Camel-Case - (是不是感覺更高雅了)
- 實(shí)際上聪建,有些人不喜歡下劃線
- 駝峰命名發(fā)就是將 多個(gè)單詞 拼接在一起形成一個(gè)整體作為變量名,而區(qū)分開不同的單詞就是大小寫茫陆,如:
- myFisrtName, differentWordList
- 一般來(lái)說(shuō)金麸,第一個(gè)單詞小寫,往后每接一個(gè)單詞都要首字母大寫盅弛。據(jù)說(shuō)這樣可以提高程序的可讀性钱骂,至于是不是這樣,那就見仁見智啦挪鹏。
-
匈牙利命名法 - (一看就覺得很厲害)
- 基本原則是:變量名 =屬性 型別 物件描述
- 這種一般是大佬命名法见秽,需要寫巨型程序時(shí)比較有優(yōu)勢(shì),對(duì)于普通人來(lái)說(shuō)讨盒,前兩種任選一種就足夠了
列表 list
列表的構(gòu)造非常簡(jiǎn)單解取,[] 中括號(hào),逗號(hào)分割
-
列表返顺,實(shí)際上可以理解為一個(gè)大的快遞柜
- 它非常的寬容禀苦,你扔什么進(jìn)去蔓肯,它就能存什么。
- 而且它不挑振乏,無(wú)論是重復(fù)的元素蔗包,還是不同類型的變量,它都能接納
-
列表是有序的
- 寬容慧邮,不代表沒有底線
- 實(shí)際上调限,列表很有自己的規(guī)則,里面存放的元素都是乖乖排隊(duì)站好误澳,而且每個(gè)都有自己的標(biāo)號(hào)耻矮。(想要取出某個(gè)元素就像你知道貨架號(hào)去取快遞一樣)
num_list = [1,8,6,1,7] ### 這是一個(gè)存放數(shù)字的列表
mixList = [1,'panda','4',9] ### 這是一個(gè)混合元素的列表
list2_in_list1 = [[1,8,6,1,7],[1,'panda','4',9]] ### 列表里面也能放列表
dict_in_list = [{'a':30},] ### 當(dāng)然存?zhèn)€字典也不是什么問題
### 取出元素,本來(lái)不想講的忆谓,還是提一下吧
### 比如說(shuō)上面的 num_list裆装, 我想取第二位 ‘8’
### 則:
num_list = [1,8,6,1,7]
target = num_list[1] ## 用中括號(hào)去,Python 從0可以計(jì)數(shù)倡缠,所以是[1], 這個(gè)也叫 列表的切片
- 然而哨免,大多數(shù)情況下,不會(huì)有一個(gè)列表傻傻的站在那里等你毡琉。
- 更多的情況是铁瞒,把列表當(dāng)做一個(gè)容器,裝你需要的東西桅滋。
- 裝完以后再根據(jù)自己的需求慧耍,取列表中的元素。(切片)
- 所以列表的構(gòu)建常常和循環(huán)(for)丐谋、判斷(if)搭配使用芍碧。
例一:找出100內(nèi)的所有質(zhì)數(shù)
- 我們可能需要用到額外的東西:
- for / while 循環(huán)
- if 判斷
- .append() 將元素添加到列表
- 可能還需 range(), len() 幫助你執(zhí)行循環(huán)的好東西
### 比如說(shuō),我想取出100內(nèi)所有質(zhì)數(shù)構(gòu)成列表
### 首先分析問題号俐,質(zhì)數(shù)的定義是:大于1的自然數(shù)中泌豆,除了1和它本身以外不再有其他因數(shù)的自然數(shù)。
### 判斷一個(gè)數(shù)是否為質(zhì)數(shù) 只要依次除以 所有比自身小的整數(shù)吏饿,只要如果商是整數(shù)只有一個(gè)(除1得到它本身)踪危,那這個(gè)數(shù)就是質(zhì)數(shù)。如果不只一個(gè)整數(shù)商猪落,那就是素?cái)?shù)贞远。
all_num = range(1,101)
## range()函數(shù),獲取一個(gè) 1 - 100 的列表, (其實(shí)要 list(range(1,101)才是我們熟悉的列表的樣子笨忌,range()只是一個(gè)函數(shù))
## 為啥是 101蓝仲,如果是100,因?yàn)?Python 從0開始取,取100個(gè)數(shù)字就到99
## 現(xiàn)在我們從1開始取袱结,要取100個(gè)數(shù)亮隙,當(dāng)然要到101
prime_num = [] ## 新建一個(gè)空列表
for i in all_num:
test_num = i ## 依次取出 1 - 100
num = 0 ## 用于記錄出現(xiàn)整數(shù)商的個(gè)數(shù),因?yàn)橘|(zhì)數(shù)的整數(shù)商應(yīng)該只有一個(gè)垢夹,那就是它本身(除以1)
for j in range(1,test_num): ## 還是從1開始溢吻,取到比這個(gè)數(shù)自身小1
quotient = test_num/j ## 求商,看商是否為整數(shù)果元,如果是煤裙,說(shuō)明這個(gè)數(shù)不只一個(gè)因數(shù),那他就不是因素
if quotient in list(all_num): ## 可能的整數(shù)都在 all_num 里
num += 1 ## 如果是整數(shù)噪漾,記錄數(shù) +1
if num == 1: ## 如果商只有一個(gè)整數(shù),那說(shuō)明這是個(gè)質(zhì)數(shù)
prime_num.append(i) ## 將這個(gè)數(shù)添加到質(zhì)數(shù)的列表中
print(prime_num) ## 打印出來(lái)看看結(jié)果對(duì)不對(duì)
#--------------------------------結(jié)果————————————————————————
#[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
### 思考一下且蓬,為什么 num 為什么要放在第一個(gè)循環(huán)里面欣硼?
### 以上只是我的思路,不一定是最優(yōu)的方法
### 實(shí)際上恶阴,也不用除比自己小的數(shù)诈胜,只要比自己二分之一小的數(shù)就足夠了,以為除比自己二分之一大的數(shù)肯定是小于2 (自己想想吧冯事,代碼我不寫了)
好吧焦匈,其實(shí)我給的只是一個(gè)無(wú)聊的例子。在實(shí)際應(yīng)用中昵仅,要根據(jù)自己數(shù)據(jù)的特點(diǎn)缓熟,提取需要的數(shù)據(jù),這就是為什么一開始說(shuō)的摔笤,你要對(duì)自己的“數(shù)據(jù)長(zhǎng)什么樣子够滑,希望整理后的數(shù)據(jù)長(zhǎng)什么樣子”,有個(gè)把握吕世。然后利用循環(huán)彰触,判斷,將元素添加( .append() )到列表中命辖,構(gòu)建符合目的的列表况毅。
例二:找出子目錄下所有的 .csv 文件,打開并逐行打印
- (為什么要逐行打佣А尔许?) - 因?yàn)槟隳苤鹦腥〕鰯?shù)據(jù),說(shuō)你可以隨心所欲地對(duì)數(shù)據(jù)進(jìn)行加工處理漓帚,比如“加減乘除”母债。
- CSV 文件說(shuō)明一下,這是一種用逗號(hào)分割的文本文件≌泵牵可以直接用 Excel 打開迅皇,Excel 也可以直接保存工作表為 csv 格式文件,這意味著衙熔,我們可以配合著 Excel 使用登颓,因?yàn)?Excel 在可視化數(shù)據(jù)時(shí)具有獨(dú)特的優(yōu)勢(shì)。
- 我們可以在 Excel 中預(yù)處理數(shù)據(jù)红氯,如 “手動(dòng)數(shù)據(jù)數(shù)據(jù)”框咙,再放到 Python 中用 pandas 做進(jìn)一步的加工
- 也可以用 pandas 處理好數(shù)據(jù)后保存為 csv 文件,然后用 Excel 打開查看結(jié)果痢甘。
-
一圖勝前言喇嘱,請(qǐng)看
- 我們可能需要用到額外的東西:
- os 調(diào)用系統(tǒng)一個(gè)庫(kù)
- if string.endswith(): 判斷文件是否以 ‘’.csv‘’ 結(jié)尾。同理塞栅,判斷是否以 “xxx” 開頭者铜,應(yīng)用 string.strartswith()
- .append() 將元素添加到列表
- 可能還需 range(), len() 幫助你執(zhí)行循環(huán)的好東西
- pandas 打開,處理及保存 csv 文件 (提前用到放椰,后面會(huì)細(xì)講)
import os
import pandas as pd ### 簡(jiǎn)寫作烟,之后就不用敲 "pandas" 那么多字符,直接敲 "pd" 就好
filePath = '/User/data' ### 假設(shè)我的數(shù)據(jù)雜亂的放在這個(gè)目錄(文件夾)下
fileList = os.listdir(filePath) ### 返回一個(gè)列表砾医,這個(gè)列表包括這個(gè)目錄下所有的文件以及文件的名字拿撩,要注意,是名字如蚜,不是路徑压恒。
csvFileList = [] ### 新建一個(gè)列表用于存放csv文件路徑
for i in fileList:
if i.endswith('.csv'): ### 找出.csv 后綴的文件
file = filePath + '/' + i ### os.listdir() 獲取到只是名字,要自己構(gòu)造成完整的路徑
csvFileList.append(file)
for csv in csvFileList: ### 依次打開 csv
data = pd.read_csv(csv) ### 調(diào)用 pandas 里面的 read_csv() 讀取 csv 文件內(nèi)容怖亭,
###實(shí)際上涎显,直接 a = open(csv,'r') 也能打開,不過那是一個(gè)文本兴猩,
dataframe = pd.DataFrame(data) ### 用 pandas 的.DataFrame() 將數(shù)據(jù)裝為 **數(shù)據(jù)框**期吓, 這個(gè)是這一篇文章像將的重要數(shù)據(jù)結(jié)構(gòu)
print(frame.ix[0]) ### ix[var1,var2] 第一個(gè)是行,第二個(gè)是列倾芝,后面會(huì)細(xì)講讨勤。 這里的意思是取第一個(gè)除了打印,記住 Python 從0開始
####### 后記說(shuō)明
### 一般來(lái)說(shuō)晨另,我們用 Excel 整理數(shù)據(jù)時(shí)潭千,每一列,都有一個(gè)列表借尿,即第一行刨晴,是列名屉来。如:“姓名”,“年齡”狈癞,“分?jǐn)?shù)”茄靠。
### 所以在我們?nèi)?shù)據(jù)時(shí),其實(shí)取的是第二行的數(shù)值蝶桶,但pd.read_csv()其實(shí)是默認(rèn)第一行為 header(列名)慨绳,并默認(rèn)加上 index(行號(hào))
### 如果第一行不是 header 可以手動(dòng)關(guān)閉
# data = pd.read_csv(csv,header=None) ##注意None,不是 False
### 如果想保存為新的 csv
# dataframe.to_csv(save_path) ## save_path 是存在的文件路徑
字典 dict
- 字典的形式是: a = {‘key’:’value’} ; ( {}大括號(hào)真竖,key鍵 和 value值 一一對(duì)應(yīng))
- 在列表中脐雪,我們是根據(jù)元素所在的位置來(lái)取出元素 (知道貨架號(hào)去拿快遞)。但是在字典里恢共,每個(gè)元素都有一個(gè)對(duì)應(yīng)的“鑰匙” (這時(shí)相當(dāng)于你那取貨碼去快遞柜取快遞一樣)
- 字典是無(wú)序的战秋,但是 key 和 value 是一一對(duì)應(yīng)的。正是因?yàn)檫@樣讨韭,所以有無(wú)順序并不重要获询。反正 key 是唯一的,隨時(shí)能找到 value拐袜。
- 因?yàn)?key 和 value 是一一對(duì)應(yīng)的,所以一個(gè)字典里梢薪,key 的取值是唯一的蹬铺,value 不一定,可以重復(fù)秉撇。(就像我的取貨碼key只能取自己的快遞甜攀,但是我們可以買一樣的東西 value)
- 構(gòu)建字典的方法:
########## 第一種(推薦)
a_dict = {'apple':5} ### apple 對(duì)應(yīng)的值是5
a2_dict = {'apple':'five'}
b_dict = {'apple':[4,8,5]} ### apple 對(duì)應(yīng)一個(gè)列表,比如說(shuō)3個(gè)人琐馆,各自有4规阀,8,5 個(gè)蘋果
c_dict = {'apple':{'big':5,'small':6}} ### apple 對(duì)應(yīng)一個(gè)字典(這種叫嵌套字典)
# 字典構(gòu)造的格式很簡(jiǎn)單瘦麸,大括號(hào){}谁撼,里面是{'key1':value1,'key2':'value2'}
# 以上三個(gè)例子展示了字典的可變性,value 可以是變量(數(shù)字滋饲、字符串)厉碟、列表和字典,其中列表屠缭、字典里面有可以繼續(xù)嵌套箍鼓,但是這里溫馨提示一句,字典嵌套太多很容易亂呵曹,而且代碼的效率低(嵌套多款咖,循環(huán)多)何暮,所以最好還是想辦法簡(jiǎn)化你的程序。
#------------------------------------------------------------#
############ 第二種 在已有字典的情況下添加 (實(shí)用)
a_dict = {'apple':5}
a_dict['peach'] = 8
## 這時(shí)候的 a_dict = {'apple':5,'peach',8}
#------------------------------------------------------------#
############ 第三種 使用 dict.setdefault() (推薦)
a_dict.setdefault('banana',67) ## 第一次參數(shù)是 key, 第二個(gè)參數(shù)是預(yù)設(shè)的默認(rèn)值
## 實(shí)際上铐殃,如果直接 寫a_dict.setdefault('banana')海洼,返回的是 None, 因?yàn)樵镜?a_dict 里面沒有 'banana' 這個(gè)鍵
#------------------------------------------------------------#
############ 第四種 用 dict() 函數(shù)轉(zhuǎn)換 雙值子序列
# 什么是 雙值子序列 ?
# 如:letter=[['a','b'],['c','d'],['e','f']]
# 像這樣兩兩配對(duì)好的 列表背稼、元組
# 如:[('a','b'),(c','d'),('e','f')] , ['ab','cd','ef'] 這些都是
letter=[['a','b'],['c','d'],['e','f']]
l_dict = dict(letter)
## 這個(gè)就相當(dāng)于l_dict2, 第一個(gè)元素為 key, 第一個(gè)元素為 value
l_dict2 = {'a':'b','c':'d','e':'f'}
- 如何取字典里面的東西
a_dict = {'apple':5,'peach',8}
### 取鍵
key = a_dict.keys() ### 結(jié)果:dict_keys(['apple','peach']),返回的并不是列表贰军,而是一個(gè)對(duì)象
key = list(key) ### 結(jié)果['apple','peach'],好了現(xiàn)在是列表的
# 一般情況下蟹肘,取鍵和循環(huán)搭配使用
for k in a_dict.keys():
key = k
print(key) ### 結(jié)果程序依次打印词疼,'apple','peach'
### 取值,同理,.values()
### 鍵 和 值 一起取 .items()
for k,v in a_dict.keys():
key = k
value = v
print(key)
print(value) ### 依次打印'apple','peach','5','8'
- 在更多的時(shí)候综液,我們并不會(huì)動(dòng)手完完整整的碼一個(gè)字典噩斟,太累了
所以,我們需要一些優(yōu)雅的技巧
例一舵盈,如何合并并將兩個(gè)等長(zhǎng)的列表(list)轉(zhuǎn)為字典(dict)
- 為什么要合并兩個(gè)等長(zhǎng)的字典?
- 很簡(jiǎn)單的一個(gè)例子球化,學(xué)生成績(jī)秽晚,學(xué)生名單一個(gè)列表,成績(jī)一個(gè)列表筒愚,但是兩者一一對(duì)應(yīng)赴蝇。(其他情況自己類別使用)
### 第二種字典構(gòu)造方法 dict() 排上用場(chǎng)啦
name = ['xiaoming','zhubajie','shadiao','xiaoming2'] ## 字典 key 是唯一的,如果重命了要想辦法區(qū)分開來(lái)
score = [90,88,45,100]
studentScore = dict(zip(name,score))
## zip() 函數(shù)將對(duì)象中*對(duì)應(yīng)的*元素打包成一個(gè)個(gè)元組巢掺,返回一個(gè)對(duì)象句伶。
## dict() 對(duì)這個(gè)對(duì)象解析,構(gòu)成一個(gè)新的字典
print(studentScore)
#----------------結(jié)果
# {'xiaoming': 90, 'zhubajie': 88, 'shadiao': 45, 'xiaoming2': 100}
例二陆淀,如何是 dict.setdefault() 構(gòu)建較復(fù)雜字典
- 很多時(shí)候考余,我們不是提前知道 key 和 value。而是在循環(huán)的過程中轧苫,找到目的值楚堤,再代入 key 和 value。
- dict.setdefault(key,default=None) 接收兩個(gè)參數(shù)含懊,第一個(gè)參數(shù)是健的名稱钾军,第二個(gè)參數(shù)是默認(rèn)值。如果字典中包含有給定鍵绢要,則返回該鍵對(duì)應(yīng)的值吏恭,否則返回為該鍵設(shè)置的值。
- (之前處理數(shù)據(jù)時(shí)真的遇到過一些經(jīng)典的例子重罪,但是在寫的時(shí)候想不起來(lái)樱哼,想到再更吧哀九,一般來(lái)說(shuō),直接用 dict[key] = value 沒毛病搅幅,但是也存在只能用 .setdefault() 預(yù)設(shè)默認(rèn)值的情況)
### 1. 常規(guī)操作
studentScore = {'xiaoming': 90, 'zhubajie': 88, 'shadiao': 45, 'xiaoming2': 100,'surperman':1000,'kate':56,'sanman':92,'keiven':73,'xijinping':99,'caixukun':44,'wangzhe':66,'king':89}
## 比如說(shuō)阅束,我們想把所有 k 開頭的同學(xué)成績(jī)?nèi)〕鰜?lái)構(gòu)成一個(gè)新的字典
KstudentScore = {} ### 先建一個(gè)空白字典備用
for k,v in studentScore.items(): ## 依次取出 鍵,值
name = k
score = v ## 其實(shí)直接用k,v也行茄唐,但我覺得這樣更優(yōu)雅息裸,哪怕過一年你也知道自己在干嘛
if name.startswith('k'):
KstudentScore.setdefault(name,score)
print(KstudentScore.setdefault)
## 或者 KstudentScore[name] = score 也是行的
## ---------------- 結(jié)果 ----------------------
## {'kate': 56, 'keiven': 73, 'king': 89}
##############################################################
### 2.key 對(duì)應(yīng)的值是一個(gè)列表 list (字典同理)
### 比如說(shuō),每個(gè)同學(xué)有三次成績(jī),放在三個(gè)字典里(具體的我不寫了)
## 那么第一個(gè)粗暴的方法就是我提前把說(shuō)有的鍵值 key都準(zhǔn)備好沪编,對(duì)應(yīng)一個(gè)列表[]呼盆,到時(shí)候找到每找到一個(gè)同學(xué),.append()添加進(jìn)去就行啦
allScore = {'xiaoming':[],'laoli':[],'zhubajie':[]} ## 假設(shè)全班就三個(gè)人
for k1,v1 in studentScore1.items():
allScore[k1].append(v1)
for k2,v2 in studentScore2.items():
allScore[k2].append(v2)
for k3,v3 in studentScore3.items():
allScore[k3].append(v3)
## 完全沒毛病
## 但是我們要優(yōu)雅蚁廓,所以
allScore2 = {}
score = [studentScore1, studentScore2, studentScore3]
for scoreDitc in score:
for k,v in scoreDitc.items():
allScore2.setdefault(k,[]).append(v) ## 直接構(gòu)建字典并添加值到對(duì)應(yīng)的列表
#---------------幻想中的結(jié)果
# {'xiaoming':[97访圃,49,79],'laoli':[87相嵌,56腿时,38],'zhubajie':[100,87饭宾,97]}
#### 如果要嵌套字典批糟,原理一樣,格式為
dict.setdefault(key,{})['key2']=value
由于每個(gè)人需要處理的數(shù)據(jù)都不盡相同看铆,我也不能舉出十全十美的例子跃赚,大家根據(jù)實(shí)際情況選擇合適的工具使用。我感覺自己也沒有講清楚性湿,如果有什么疑惑或建議,歡迎聯(lián)系满败。
數(shù)據(jù)框 dataframe (終于到重點(diǎn)了)
- 數(shù)據(jù)框最通俗的理解就是一張 Excel 的工作表
- 為什么要學(xué)這種數(shù)據(jù)類型肤频,因?yàn)檫@種是我們看著舒服的數(shù)據(jù)類型。(上圖吧)
-
比如說(shuō)我有一批水果的數(shù)據(jù):(隨便在 Excel 上面碼了一些數(shù)字不要在意細(xì)節(jié))算墨,這個(gè)就是一個(gè) dataframe宵荒,所有的信息都非常清晰
-
- 如何構(gòu)建 dataframe
### 1. 最常見的其實(shí)是我們直接讀取原本就已經(jīng)構(gòu)建好的 csv 文件
data = pd.read_csv('/User/shop/fruit.csv') #讀 csv 文件
df = pd.DataFrame(data) #轉(zhuǎn)為數(shù)據(jù)框
print(df) #很多人不可看看結(jié)果是不會(huì)心死的
#----------------------結(jié)果
# student score
# 0 xiaoming 84
# 1 xiaodong 93
# 2 wujingtao 100
# 3 superman 0
# 前面也說(shuō)了,pd.DataFrame() 會(huì)默認(rèn)把第一行作為 header净嘀,并且會(huì)默認(rèn)添加 index (就是上面你看到左邊的 0123)报咳,如果不想用,可以禁掉挖藏,我們看看效果
data2 = pd.read_csv('/User/shop/fruit.csv',header = None) # 注意是 None,不是 False
df2 = pd.DataFrame(data2)
print(df2)
#----------------------結(jié)果
# 0 1
# 0 student score
# 1 xiaoming 84
# 2 xiaodong 93
# 3 wujingtao 100
# 4 superman 0
#
# 結(jié)果就是 會(huì)用數(shù)字作為你的 header
# 為什么需要 header 和 index暑刃,就是為了方便你取值 (另一篇再講吧)
#------------------------------------------------------------#
### 2. 將字典轉(zhuǎn)為 DataFrame (這個(gè)也很常用,上面是讀取膜眠,這個(gè)是輸出)
### 還記得上面三次考試成績(jī)嗎
### {'xiaoming':[97岩臣,49溜嗜,79],'laoli':[87,56架谎,38],'zhubajie':[100炸宵,87,97]} 我還是拿過來(lái)吧
### 現(xiàn)在我們想 優(yōu)雅地 將這些數(shù)據(jù)轉(zhuǎn)成 datafame谷扣,怎么做呢土全?
studentScore1 = {'xiaoming':97,'laoli':87,'zhubajie':100}
studentScore2 = {'xiaoming':49,'laoli':56,'zhubajie':87}
studentScore3 = {'xiaoming':79,'laoli':38,'zhubajie':97}
### 還是得準(zhǔn)備些數(shù)據(jù)才能講得清
dempDict = {} ##先創(chuàng)建個(gè)臨時(shí)的空白字典備用
score = [studentScore1, studentScore2, studentScore3] ## 我們還是假設(shè)有三次成績(jī)
examNum = 0
for scoreDitc in score:
examNum += 1 ##記錄考試場(chǎng)數(shù)
name_list = [] ## 創(chuàng)建一個(gè)文件存學(xué)生名字,思考一下為什么要這么做
for name,score in scoreDitc.items(): ##這時(shí)我們需要分門別類的將數(shù)據(jù)放好
if name not in name_list:
name_list.append(name)
else:
pass
dempDict.setdefault('Exam{}'.format(examNum),[]).append(v) ## .format 是一個(gè)字符串格式化方法非常棒会涎,我放另一篇里面講
dempDict['name'] = name_list ## 最后將學(xué)生信息也存進(jìn) dempDict里面
df = pd.DataFrame(dempDict)
print(dempDict)
print('\n')
print(df)
#----------------------結(jié)果
#{'Exam1': [97, 87, 100], 'name': ['xiaoming', 'laoli','zhubajie'], 'Exam2': [49, 56, 87], 'Exam3': [79, 38, 97]}
# Exam1 name Exam2 Exam3
# 0 97 xiaoming 49 79
# 1 87 laoli 56 38
# 2 100 zhubajie 87 97
##### 1. 首先思考兩個(gè)事情:(1) 為什么 dempDict = {} 是放在最外面的裹匙,放在循環(huán)里面可以嗎? (2) 為什么name 要額外處理
比較重要的說(shuō)明我還是放在外面吧
1. 首先在塔,這種方法構(gòu)建的時(shí)候幻件,列表必須是等長(zhǎng)的,如上面的列表全是都是3個(gè)元素蛔溃。如果不等長(zhǎng)會(huì)怎么樣绰沥?抱歉會(huì)報(bào)錯(cuò)。如果真的缺數(shù)據(jù)怎么辦贺待,(比如有人缺考了)徽曲,那就想想辦法補(bǔ)齊,比如說(shuō)補(bǔ) 0 或 空格麸塞。上面這個(gè)例子不好改秃臣,因?yàn)檫@里例子里面即使缺考,也必須會(huì)有一個(gè)值哪工,否則就構(gòu)不成字典奥此,但是實(shí)際中你可以會(huì)遇到其他情況,這時(shí)可以選擇用 .append(0) 或 .append(‘’) 代替雁比,使得列表(list)等長(zhǎng)
2. 敏銳的你一定注意到稚虎,dempDict 里面的每一個(gè) 鍵 key,就是對(duì)應(yīng) df (dataframe) 里面的 header
3. 但是也應(yīng)該觀察到偎捎,dempDict 是無(wú)序的蠢终,但是 df (dataframe) 里面的 header 的順序是和 dempDict 保持一致的。這種不符合我們的期待茴她,因?yàn)槲覀兏朊址旁诘谝涣醒胺鳎且趺锤哪兀?/p>
### 自定義 dataframe 的 header
scoreDict = {'Exam1': [89, 89, 89], 'name': ['xiaoming', 'laoli','zhubajie'], 'Exam2': [89, 89, 89], 'Exam3': [89, 89, 89]} ## 偷懶直接 copy 了
df = pd.DataFrame(dempDict,columns = ['name','Exam1','Exam2','Exam3']) ## 好吧其實(shí)加個(gè)columns就好了
print(df)
#----------------------結(jié)果
# name Exam1 Exam2 Exam3
# 0 xiaoming 97 49 79
# 1 laoli 87 56 38
# 2 zhubajie 100 87 97
#
## 漂漂亮亮噠
##### 如何保存? 如何將 dataframe 保持為 csv 文件
df.to_csv(sava_path) ### 很簡(jiǎn)單的一句話丈牢,sava_path是你要放的路徑祭钉,包含文件名,如'/User/output/examScore.csv'
### 然而直接保存時(shí)己沛,會(huì)默認(rèn)保持 index (左邊的一列數(shù)字)朴皆,由于后續(xù)用 Excel 打開時(shí)帕识,本身就帶序號(hào),還是從1開始遂铡,符合人性肮疗,所以很多人不希望輸出 index,那要怎么辦呢扒接?
df.to_csv(sava_path,index = False) ### 加個(gè)index = False就好了
好吧這篇先說(shuō)到這里吧伪货,寫得夠多的了。
最終的目的是將數(shù)據(jù)整理好钾怔,形成 dataframe 的樣子
再次強(qiáng)調(diào)碱呼,這篇文章的目的是將數(shù)據(jù)整理成下面這個(gè)
#----------------------結(jié)果
# name Exam1 Exam2 Exam3
# 0 xiaoming 97 49 79
# 1 laoli 87 56 38
# 2 zhubajie 100 87 97
#
下一篇,我打算講 dataframe 的數(shù)據(jù)處理操作 (篩選宗侦,過濾愚臀,合并,計(jì)算矾利,重塑等)
再下一篇姑裂,我想將統(tǒng)計(jì)學(xué)的內(nèi)容整理進(jìn)來(lái)
至此,才能優(yōu)雅的玩轉(zhuǎn)數(shù)據(jù)
最后說(shuō)一下男旗,我寫的方法其實(shí)不是最優(yōu)雅的舶斧,一定有其他計(jì)算機(jī)大佬寫得比我漂亮 (比較我是生物背景的)。所以如果本篇出現(xiàn)錯(cuò)漏察皇,或者有更好地思路茴厉,歡迎留言討論。
后記什荣,原本不想寫那么多的矾缓,因?yàn)閷懱嗫勺x性差,看一會(huì)就不想看了稻爬。
但是我個(gè)人的使用經(jīng)驗(yàn)又是各部分都有關(guān)聯(lián)嗜闻,如果單獨(dú)拆開來(lái)講就不太實(shí)用,”知道是什么“和“知道如何靈活使用”還是兩碼事因篇。
所以我想綜合寫一下比較實(shí)用的思路,至于每個(gè)數(shù)據(jù)類型的細(xì)節(jié)處理笔横,以后會(huì)獨(dú)立成章竞滓,有空再分享吧。
作者:發(fā)哥
鏈接:發(fā)哥的檔案室 - 簡(jiǎn)書
來(lái)源:簡(jiǎn)書
著作權(quán)歸作者所有吹缔。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)商佑,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。