免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

Pandas學習筆記(DataFrame基本操作)

 PlanBlank 2018-06-05

    對于生成的dDataFrame,下一步進行的是對他的基本操作,增、減、改、查。

一. 數(shù)據(jù)選取

    從已有的DataFrame中取出其中一列或幾列,并對其進行操作。

    Pandas取出DataFrame的列有兩種方式,兩個方式?jīng)]有好與壞之分,還是看個人喜歡用哪個

  1. #-*- coding:utf-8 -*-  
  2. import pandas as pd  
  3.   
  4. df = pd.DataFrame({'goods':['coke cola', 'eggplant','condom'], 'quantity':[12,3,1], 'price':[20,12,80]})  
  5. df['goods']     #選擇df的goods這一列  
  6.   
  7. df.goods         #同上,是選擇列的第二種方法  
    需要注意的是,第一種方法看似像是一種列表形式,但是如果像是如下方式書寫代碼會報錯

  1. df['goods','quantity']     #會報錯,不要妄想通過這種方式獲取多列。  
   上方的形式會引發(fā)一個KeyError的錯誤。如果想通過第一種形式獲取多列,正確的形式如下

  1. df[['goods','quantity']]  
    將多列的列名按照一個list的形式傳入,就可以獲取一個DataFrame的多列。

二. 數(shù)據(jù)篩選

    往往選取出幾個DataFrame的列并不能滿足篩選,DataFrame的篩選的形式比較特殊,對列進行篩選時用到的是之前所講的第二種選取列的形式,有點像是把列名視為一個DataFrame的屬性。

  1. #-*- coding:utf-8 -*-  
  2. import pandas as pd  
  3.   
  4. df = pd.DataFrame({'goods':['coke cola', 'eggplant','condom'], 'quantity':[12,3,1], 'price':[20,12,80]})  
  5. print df[df.goods =='eggplant']     #      goods  price  quantity  
  6.                                      # 1  eggplant     12         3  
    上面代碼的意思是選取DataFrame中,goods列的值為'eggplant‘的所有行。DataFrame中也支持多條件篩選,與Python的判斷語句相同,and、or、not 和 xor分別代表 和、或、非、抑或。也可以用符號代替 &、|、~、^。每個判斷條件要用圓括號括起來,否則會報錯

  1. df[(df.goods =='eggplant') & (df.quantity == 12)]   
    選取df中 goods列值為 eggplant且 對應的 quantity值為12的所有列。

    在篩選數(shù)據(jù)時候也可以使用loc和iloc函數(shù)實現(xiàn)子集的選取,意思并不是說上方的篩選語句不對,親測同樣很好用,而且代碼簡單了點。loc和iloc進行數(shù)據(jù)篩選的格式如下:

  1. df = df.loc[df.goods=='eggplant', :]  
.loc[]相當于是把想要篩選的列通過 ':'全部選出來。loc方法同樣支持多條件篩選。
  1. df = df.loc[(df.goods =='eggplant') & (df.quantity == 12), :]   
    loc形式的多條件篩選,條件與條件之間同樣要使用括號分割開。這兩行l(wèi)oc方法篩選的結果與之前沒用loc方法寫的代碼效果是一樣的,格式規(guī)范而言肯定是有l(wèi)oc的更容易讓人理解。但是如果只是給自己寫腳本完全可以用前一種,必要時候做個注釋即可。

    條件篩選的另一種形式,就是選取一個DataFrame中滿足條件的行的某幾列(并不是全部列)。此時只需將上面的代碼做一小點改變即可。

  1. df = df.loc[(df.goods =='eggplant') & (df.quantity == 12), ['goods', 'price']]  
   此時親測使用loc方式會比較好一些,因為之前l(fā)oc形式后方的 ':' 代表的是滿足條件的全部行的所有列的數(shù)據(jù),一個冒號囊括了所有列。此時要是指定其中的某幾列,通過list的形式,list的元素是DataFrame的列名,元素類型是字符串。上方的代碼所表達的是滿足條件的所有行的 goods 和 price 兩列。


三. 數(shù)據(jù)的修改

    數(shù)據(jù)的修改往往有這幾種形式 ① 針對某個值或者某個范圍的值的修改。  ② 增加列、刪除列  ③ 增加行、刪除行  ④修改索引  ⑤修改列名

    數(shù)據(jù)值的修改常見于分類的問題中,比如將一個列作為分類的列,有時候往往該列的值不是想要的數(shù)字表示的不同分類,或者更復雜是一個連續(xù)變量,此時針對DataFrame的修改就格外重要。

添加列

  1. df['price'][df.price > 15] = 'expensive'  
    通過這一行代碼,就將df的 price 一列的大于15的商品定義為 ‘expensive’。分類問題中不同的類常常用不同的數(shù)字來表示,而不同類之間的轉換需要的就是這樣的篩選與修改。

    增加列的方法很簡單,而且很常用,比如想要在之前的df中添加一個叫‘remain’的列,記錄是否有貨,可以直接使用下面的代碼:

  1. df['remain'] = 'yes'  
這樣就在之前的df后面又加了一列‘remain’,但是這一整列的值為‘yes’。如果不想在末尾加列,而是想在某列之間添加一列,那么就需要使用insert方法。

  1. df.insert(int=0, column = 'remain', value='yes')  
    int參數(shù)傳入的是一個整數(shù),這個整數(shù)是插入列所在的位置,0代表列的索引為0的位置,也就是第一列。 column參數(shù)是設置列名。 value值是給這列賦值,可以是字符串,如果是字符串,那么這一列的值都會是這個字符串;也可以是Pandas的Series,或者是Python的list。這樣可以使得這一整列不是同一個值。

刪除列

    列的刪除使用Pandas模塊中的drop()方法最為高效。假如要刪除剛才添加的remain列。

  1. df.drop(labels='remain', axis=1, inplace=True)  
上方這行代碼會成功刪除DataFrame中的‘remain’列,注意:如果inplace參數(shù)不指定為True,只會在內(nèi)部刪除,df并不會被真正改變。axis參數(shù)默認是0,也就是代表著行,所以刪除列時要把axis改為1

如果想刪除df中多個列,drop()方法也是可以的。

  1. df.drop(labels=['remain', 'quantity'], axis=1, inplace=True)  
將想刪除的多個列名以Python的列表形式傳給labels參數(shù),就可以在該數(shù)據(jù)框中刪除列表中的列。

添加行

    Pandas的添加行方式有很多種不過最為直觀的方式是這樣的

  1. df.loc[3]={'goods':'shampoo','quantity':13, 'price':50}  
    loc又出現(xiàn),在索引為3的行(第四行)插入一組數(shù)據(jù)。數(shù)據(jù)的形式按照字典的形式傳入。還有一種方法是通過append方法。

  1. df = df.append({'goods':'shampoo','quantity':13, 'price':50}, ignore_index=True)  
    也是使用dict形式傳入。

刪除行

  1. df.drop(labels = 1, axis=0,inplace = True)  
刪除索引為1的行,axis=0表示橫向刪除行。刪除多行時,傳入labels的參數(shù)是一個list,元素是列的索引值。

  1. df.drop(labels = [1, 4, 6], axis=0,inplace = True)  
刪除df中的索引為1,4,6的行。

修改索引

    修改索引有兩種情況,改變索引和不改變索引。

① 不改變索引,可以看做是將原始數(shù)據(jù)按照索引順序排序

  1. df.sort_index(axis=1,ascending=False)  
    axis表示所有列都隨著索引一起變位置,ascending是降序的意思,默認是False。

② 改變索引

set_index()方法

  1. df.set_index(keys='goods',inplace=True)  
    將df的goods這一列設置成索引,在原數(shù)據(jù)框中改。這個方法感覺更適合之前沒有索引的情況下。當之前設置了索引的情況下需要的是reindex方法。

  1. df.reindex(new_index,axis=0)  

    new_index可以是Python列表,元素是現(xiàn)在已有的索引的一部分值,這個方法常常用于保留想留下的行

修改列名

    修改列名需要用到的是rename()方法。

  1. dynamic_RNApol.rename(columns={'d0': 'rnapol_d0', 'd1': 'rnapol_d1', 'd3': 'rnapol_d3', 'd5': 'rnapol_d5', 'd7': 'rnapol_d7','d11': 'rnapol_d11', 'd15': 'rnapol_d15', 'd18': 'rnapol_d18', 'ipsc': 'rnapol_ipsc'}, inplace=True)  
  1.   
    這就是rename改變列名的用法,傳入的形式是字典,鍵值是新名字;value值是原本的列名。這樣的好處是做到了一一對應。之后一定要加上inplace參數(shù),設置為TRUE,否則不會在原有的dataframe中改動。

數(shù)據(jù)類型轉化

    dataframe中的astype()方法是對數(shù)據(jù)類型進行轉換的函數(shù)。以一個例子進行說明

  1. df = pd.DataFrame({'id': range(4), 'age': ['13', '34', '23'], 'weight': ['45.7', '60.9', '55.5']})  
  2. df.dtypes  
    dtype的結果會顯示出,id列的數(shù)據(jù)類型是 int, 而age和weight列的數(shù)據(jù)類型都是 object。現(xiàn)在將age轉化為 int類型,weight轉化為float類型。此時astype函數(shù)的作用就有所體現(xiàn)。

  1. df.astype({'age':'int', 'weight':'float'})  
  1. valid['distance'] = valid['distance'].astype('int')  


   通過字典的形式傳入,將兩列轉換成了想要的數(shù)據(jù)類型。

數(shù)據(jù)排序

    dataframe中索引排序用到的是sort_index方法,相似的列數(shù)值排序運用的是sort_values()方法。

  1. df.sort_values( by=['age'], ascending=False, inplace=True)  #只通過age進行排序;升序;如有缺失值放在最后。  
  2. df.sort_values(by=['age', 'weight'], ascending=True, inplace=True, na_position='first') #先通過age排序,在其基礎上通過weight排序;降序,缺失值放在最前方。  
    數(shù)據(jù)的排序在實際問題中很有用,比如找出聚類中得分最高的幾個項等等。

數(shù)據(jù)去重

    在dataframe中去除重復,使用drop_duplicates()方法。而只是檢查dataframe中是否出現(xiàn)重復有的是duplicated方法,如果只是想檢查某列中是否存在重復的值可以通過subset參數(shù)將列傳入到duplicated()方法中。

  1. df.duplicated()  #檢查整個dataframe中是否出現(xiàn)重復  
  2. df.duplicated(subset='age')  #檢查age這列是否出現(xiàn)重復數(shù)據(jù)  
  3. df.drop_duplicates()  #刪除dataframe中的重復  
    其中,subset參數(shù)傳入的可以是單一的列名;同時也可以是多個列名組成的list。

四. dataframe基本操作

數(shù)據(jù)抽樣

    dataframe的抽樣直接使用sample()方法進行,抽樣在涉及到統(tǒng)計學算法的時候很有用,所以先了解一下這個方法的參數(shù)。

  1. df.sample(n=5, replace=False)  
  2. df.sample(frac=0.2, replace=True)  
    這兩種是最常用的形式,n參數(shù)是直接指定抽多少個樣本,frac參數(shù)則是一個0到1之間的浮點數(shù),指定的是抽取的樣本占多大比例。replace表示是否是有放回的抽取,默認是FALSE。weight參數(shù)在這里沒體現(xiàn),這個參數(shù)是當樣本具有權重時候所用的,weight參數(shù)后面加的是列名,未賦值則每列的權重默認為0,如果要賦值權重,所有權重的和為1,如果和不為1,則自動進行歸一化處理。

頻率統(tǒng)計

    dataframe中,統(tǒng)計某列不同的值出現(xiàn)的次數(shù)使用value_counts()方法。

  1. df = pd.DataFrame({'id': range(4), 'name': ['Jack', 'Craig', 'Chuck', 'Jack'],'gender': ['M', 'M', 'M', 'F'] , 'age': ['13', '34', '23','4'], 'weight': ['45', '60', '55', '30']})  
    可以看到上面的dataframe中,name列有重名的,現(xiàn)在要統(tǒng)計不同的名字出現(xiàn)的次數(shù)。
  1. df.name.value_counts()  
    上面的代碼反悔的結果是在這個dataframe中,不同的名字出現(xiàn)的次數(shù)。

    value_counts()方法的一個妙用是用于求占比,假如現(xiàn)在要求的是性別的占比。

  1. df.gender.value_counts()/ sum(df.gender.value_counts)  
    這行代碼返回的是不同性別人數(shù)除以總人數(shù)所得到的個性別的占比。但是value_counts()方法只能是單變量的計數(shù)。如果想設置一個條件后在進行計數(shù),可以使用的是crosstab()方法。

  1. pd.crosstab(index=df.name, columns=df.gender)  
    這行代碼,記錄的是不同名字出現(xiàn)的次數(shù),但是將性別分開討論。columns參數(shù)可以傳入多個列,傳入形式是list,元素是列名。注意:columns傳入的列必須是離散型變量,用途是用于分類。

缺失值處理

① 缺失值的檢查

    檢查缺失值所用的函數(shù)是isnull(),這看起來和MySQL中的差不多。

  1. print any(df.isnull(), '\n')  
    檢查整個dataframe中是否存在缺失值。
  1. is_null = []  
  2. for col in df.columns:  
  3.     is_null.append(any(pd.isnull(df.col)))  

    這是檢查dataframe每行是否有缺失值。

  1. is_null = []  
  2. for index in list(df.index):  
  3.     is_null.append(any(pd.isnull(df.loc[index, :])))  

    同理。is_null方法也可以對每列進行缺失值檢查。is_null方法返回的是一個布爾值,True表示有缺失值,F(xiàn)alse表示沒有缺失值。

② 缺失值的刪除
    這是一種比較極端的方法,通過dropna()方法,這個方法的使用有兩種形式。

  1. df.dropna()  
    這種方式是將有缺失值的行全部刪除。如果在缺失值較多的情況下,數(shù)據(jù)的量會大打折扣。

  1. df.dropna('all')  
    這個是第二種形式,‘a(chǎn)ll’指明了刪除的行是所有值都為缺失值的情況,因為數(shù)據(jù)中缺失一些數(shù)據(jù)是很常見的,只刪除全部字段都為空的變量才能真正的保留更多的數(shù)據(jù)。
③ 缺失值的填補
    使用fillna()方法可以對dataframe進行缺失值的填補。
  1. df.fillna(0, inplace=True)  #最簡單的一種方式,缺失值統(tǒng)一以一個值進行填補  
  2. df.fillna(value={'id': 0, 'name': 'No', 'gender': 'unknown', 'age':'unknown', 'weight': 0}, inplace=True)  #針對不同的列設置不同的缺失填補值  
  3. df.fillna(method='ffill', inplace=True)  #用上一行的值對自身進行填補  
  4. df.fillna(method='bfill', inplace=True)  #用后一行的值對自身進行填補  
  5. df.fillna({'age': df.age.mean(), 'weight': df.weight.max()}, inplace=True)  #用不同列的極值,均值,中位數(shù)等進行缺失值填補。  


數(shù)據(jù)映射
    看見映射,想到的首先是Python中的map()函數(shù),相比于一般的for循環(huán),map函數(shù)具有極高的效率。在日常的Python編程中,map()方法所傳入的是一個函數(shù)和一個序列,這個函數(shù)會相繼作用于序列中的每一個元素。得到的是一個新的序列。dataframe也是一個特殊的可遍歷序列,但是dataframe的映射所用的是apply()方法。

  1. is_null = []  
  2. for index in list(df.index):  
  3.     is_null.append(any(pd.isnull(df.loc[index])))  
現(xiàn)在要挑戰(zhàn)for循環(huán),將原本的檢查每行是否有缺失值的for循環(huán)改成apply()形式。
  1. isnull = lambda x : any(pd.isnull(df.loc[x,:]))  
  2. is_null = df.apply(func=isnull, axis=1)  
func參數(shù)是所用的方法,這里的方法是之前設定的lambda函數(shù)。axis參數(shù)0代表映射到各列,而1代表著映射到每行。
    numpy的某些方法也能通過apply()形式作用于dataframe上,比如說現(xiàn)在有一個dataframe里面記錄的是學生的各科成績(第一列到第五列),現(xiàn)在要計算每個學生的均分,和每個科目的中位數(shù)。
  1. df['average'] = df.iloc[:, 0:5].apply(func=np.mean, axis=1)  
  2. df.iloc[:, 0:5].apply(func=np.median, axis=0)  







  1.   



                                    

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多