Python 如何優(yōu)雅地使用 pandas

如何優(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ī)則:

    1. 變量名可以包括字母撒强,數(shù)字和下劃線 (_) ,(那就是說(shuō)笙什,其他奇怪的符號(hào)都不可以)
    2. 變量名不能以數(shù)字開頭飘哨。如:day1, day_1 是對(duì)的,1day 就不可以
    3. 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)雅命名法
    1. 下劃線續(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í)在太難看了统抬,自己能看懂就行,能短就短危队。
    2. 駝峰命名法 Camel-Case - (是不是感覺更高雅了)
      • 實(shí)際上聪建,有些人不喜歡下劃線
      • 駝峰命名發(fā)就是將 多個(gè)單詞 拼接在一起形成一個(gè)整體作為變量名,而區(qū)分開不同的單詞就是大小寫茫陆,如:
      • myFisrtName, differentWordList
      • 一般來(lái)說(shuō)金麸,第一個(gè)單詞小寫,往后每接一個(gè)單詞都要首字母大寫盅弛。據(jù)說(shuō)這樣可以提高程序的可讀性钱骂,至于是不是這樣,那就見仁見智啦挪鹏。
    3. 匈牙利命名法 - (一看就覺得很厲害)
      • 基本原則是:變量名 =屬性 型別 物件描述
      • 這種一般是大佬命名法见秽,需要寫巨型程序時(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ì)。
    1. 我們可以在 Excel 中預(yù)處理數(shù)據(jù)红氯,如 “手動(dòng)數(shù)據(jù)數(shù)據(jù)”框咙,再放到 Python 中用 pandas 做進(jìn)一步的加工
    2. 也可以用 pandas 處理好數(shù)據(jù)后保存為 csv 文件,然后用 Excel 打開查看結(jié)果痢甘。
    3. 一圖勝前言喇嘱,請(qǐng)看


      關(guān)于 csv 文件的介紹.png
  • 我們可能需要用到額外的東西:
    - 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)
  1. 構(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'}  

  1. 如何取字典里面的東西
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'

  1. 在更多的時(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宵荒,所有的信息都非常清晰


      用 Excel 打開 csv 文件后現(xiàn)實(shí)的內(nèi)容 .png
  1. 如何構(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)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厢塘,一起剝皮案震驚了整個(gè)濱河市茶没,隨后出現(xiàn)的幾起案子肌幽,更是在濱河造成了極大的恐慌,老刑警劉巖抓半,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喂急,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡笛求,警方通過查閱死者的電腦和手機(jī)廊移,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)探入,“玉大人狡孔,你說(shuō)我怎么就攤上這事》渌裕” “怎么了苗膝?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)植旧。 經(jīng)常有香客問我辱揭,道長(zhǎng),這世上最難降的妖魔是什么隆嗅? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任界阁,我火速辦了婚禮,結(jié)果婚禮上胖喳,老公的妹妹穿的比我還像新娘泡躯。我一直安慰自己,他們只是感情好丽焊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布较剃。 她就那樣靜靜地躺著,像睡著了一般技健。 火紅的嫁衣襯著肌膚如雪写穴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天雌贱,我揣著相機(jī)與錄音啊送,去河邊找鬼。 笑死欣孤,一個(gè)胖子當(dāng)著我的面吹牛馋没,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播降传,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼篷朵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起声旺,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤笔链,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后腮猖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鉴扫,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年缚够,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幔妨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谍椅,死狀恐怖误堡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雏吭,我是刑警寧澤锁施,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站杖们,受9級(jí)特大地震影響悉抵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摘完,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一姥饰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孝治,春花似錦列粪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至杭措,卻和暖如春费什,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背手素。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工鸳址, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泉懦。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓稿黍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親祠斧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闻察,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容