<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Pandas數(shù)據(jù)分析,你不能不知道的技能

          共 10692字,需瀏覽 22分鐘

           ·

          2021-08-27 14:02

          ↑↑↑關注后"星標"簡說Python

          人人都可以簡單入門Python、爬蟲、數(shù)據(jù)分析
           簡說Python推薦 

          來源:簡說Python 編輯:老表

          作者:修羅閃空、pluto、喬瞧、石墨錫 

          • 一、前言

          • 二、本文概要

          • 三、pandas merge by 修羅閃空

            • 3.1 merge函數(shù)用途

            • 3.2 merge函數(shù)的具體參數(shù)

            • 3.3 merge函數(shù)的應用

          • 四、pandas apply by pluto、喬瞧

            • 4.1 pandas apply by pluto

            • 4.2 pandas apply by 喬瞧

          • pandas pivot_table by 石墨錫


          一、前言

          本文來自四位讀者的合作,這四位讀者是之前推文14個pandas神操作,手把手教你寫代碼中贈書活動的中獎者,獎品是贈書《深入淺出Pandas:利用Python進行數(shù)據(jù)處理與分析》。

          這里贈書有要求:獲贈讀者需要先說一下自己對對應最愛pandas操作函數(shù)的理解+一個對應函數(shù)應用小案例,于是也就有了今天這篇文章。

          后面贈書也會更多這樣,一來確保圖書贈送出去是給到了確實有需要、是想學習的讀者,再者獲贈讀者的分享也可以給其他未獲得贈書的讀者學習,也可以給公眾號推文積累素材。

          廢話不多說,開始今天的學習吧,三個pandas中經(jīng)典中經(jīng)典的函數(shù)使用分享,歡迎大家點贊、轉發(fā)本文,支持作者,公眾號簡說Python技術文章,只要點贊破百,老表就會在視頻號開直播帶帶大家一起進行項目復現(xiàn)。

          二、本文概要

          • pandas merge by 修羅閃空
          • pandas apply by pluto、喬瞧
          • pandas pivot_table by 石墨錫

          三、pandas merge by 修羅閃空

          3.1 merge函數(shù)用途

          pandas中的merge()函數(shù)類似于SQL中join的用法,可以將不同數(shù)據(jù)集依照某些字段(屬性)進行合并操作,得到一個新的數(shù)據(jù)集。

          3.2 merge函數(shù)的具體參數(shù)

          • 用法:
          DataFrame1.merge(DataFrame2, 
          how=‘inner’, on=None, left_on=None
          right_on=None, left_index=False
          right_index=False, sort=False, suffixes=(‘_x’, ‘_y’))
          • 參數(shù)說明:

            • how:默認為inner,可設為inner/outer/left/right;

            • on:根據(jù)某個字段進行連接,必須存在于兩個DateFrame中(若未同時存在,則需要分別使用left_on和right_on來設置);

            • left_on:左連接,以DataFrame1中用作連接鍵的列;

            • right_on:右連接,以DataFrame2中用作連接鍵的列;

            • left_index:將DataFrame1行索引用作連接鍵;

            • right_index:將DataFrame2行索引用作連接鍵;

            • sort:根據(jù)連接鍵對合并后的數(shù)據(jù)進行排列,默認為True;

            • suffixes:對兩個數(shù)據(jù)集中出現(xiàn)的重復列,新數(shù)據(jù)集中加上后綴_x,_y進行區(qū)別。

          3.3 merge函數(shù)的應用

          3.3.1 merge一般應用

          import pandas as pd

          # 定義資料集并打印出來
          left = pd.DataFrame({'key1': ['K0''K0''K1''K2'],
                               'key2': ['K0''K1''K0''K1'],
                               'A': ['A0''A1''A2''A3'],
                               'B': ['B0''B1''B2''B3']})
          right = pd.DataFrame({'key1': ['K0''K1''K1''K2'],
                                'key2': ['K0''K0''K0''K0'],
                                'C': ['C0''C1''C2''C3'],
                                'D': ['D0''D1''D2''D3']})

          print(left)
          print('------------')
          print(right)
          • 單個字段連接
          # 依據(jù)key1 column合并,并打印
          res = pd.merge(left, right, on='key1')
          print(res)
          • 多字段連接
          # 依據(jù)key1和key2 column進行合并,并打印出四種結果['left', 'right','outer', 'inner']
          res = pd.merge(left, right, on=['key1''key2'], how='inner')
          print(res)

          res = pd.merge(left, right, on=['key1''key2'], how='outer')
          print(res)

          res = pd.merge(left, right, on=['key1''key2'], how='left'# 以left為主進行合并
          print(res)

          res = pd.merge(left, right, on=['key1''key2'], how='right'# 以right為主進行合并
          print(res)

          3.3.2 merge進階應用

          • indicator 設置合并列數(shù)據(jù)來源
          # indicator 設置合并列數(shù)據(jù)來源
          df1 = pd.DataFrame({'coll': [01], 'col_left': ['a''b']})
          df2 = pd.DataFrame({'coll': [122], 'col_right': [222]})
          print(df1)
          print('---------')
          print(df2)

          # 依據(jù)coll進行合并,并啟用indicator=True,最后打印
          res = pd.merge(df1, df2, on='coll', how='outer', indicator=True)
          print(res)
          '''
          left_only 表示數(shù)據(jù)來自左表
          right_only 表示數(shù)據(jù)來自右表
          both 表示兩個表中都有,也就是匹配上的
          '''

          # 自定義indicator column的名稱并打印出
          res = pd.merge(df1, df2, on='coll', how='outer', indicator='indicator_column')
          print(res)
          • 依據(jù)index合并
          # 依據(jù)index合并
          # 定義數(shù)據(jù)集并打印出
          left = pd.DataFrame({'A': ['A0''A1''A2'],
                               'B': ['B0''B1''B2']},
                             index = ['K0''K1''K2'])
          right = pd.DataFrame({'C': ['C0''C2''C3'],
                               'D': ['D0''D2''D3']},
                             index = ['K0''K2''K3'])
          print(left)
          print('---------')
          print(right)
          # 依據(jù)左右數(shù)據(jù)集的index進行合并,how='outer',并打印
          res = pd.merge(left, right, left_index=True, right_index=True, how='outer')
          print(res)

          # 依據(jù)左右數(shù)據(jù)集的index進行合并,how='inner',并打印
          res = pd.merge(left, right, left_index=True, right_index=True, how='inner')
          print(res)
          • 解決overlapping的問題
          # 解決overlapping的問題
          # 定義資料集
          boys = pd.DataFrame({'k': ['K0''K1''K2'], 'age': [123]})
          girls = pd.DataFrame({'k': ['K0''K1''K3'], 'age': [456]})
          print(boys)
          print('---------')
          print(girls)

          # 使用suffixes解決overlapping的問題
          # 比如將上面兩個合并時,age重復了,則可通過suffixes設置,以此保證不重復,不同名(默認會在重名列名后加_x _y)
          res = pd.merge(boys, girls, on='k', suffixes=['_boy''_girl'], how='inner')
          print(res)

          四、pandas apply by pluto、喬瞧

          4.1 pandas apply by pluto

          apply函數(shù)是pandas中極其好用的一個函數(shù),它可以對dataframe在行或列方向上進行批量化處理,從而大大簡化數(shù)據(jù)處理的過程。

          apply函數(shù)的基本形式:

          DataFrame.apply(func, 
          axis=0, broadcast=False
          raw=False, reduce=None, args=(), **kwds)

          我們最常用前兩個參數(shù),分別是func運算函數(shù)和axis運算的軸,運算軸默認是axis=0,按列作為序列傳入func運算函數(shù),設置axis=1則表示按行進行計算。

          在運算函數(shù)并不復雜的情況下,第一個參數(shù)通常使用lambda函數(shù)。當函數(shù)復雜時可以另外寫一個函數(shù)來調用。下面通過一個實例來說明:

          import pandas as pd

          df = pd.DataFrame({'A':[3,1,4,1,5,9,None,6],
                        'B':[1,2,3,None,5,6,7,8]})

          d = df.apply(lambda x: x.fillna(x.mean()))
          print(df)
          print('----------')
          print(d)

          處理前的數(shù)據(jù):處理后的數(shù)據(jù):

          可以看到上面代碼通過apply對nan值進行了均值填充,填充的為nan值所在列的均值。

          在默認情況下,axis參數(shù)值為0,表示在行方向上進行特定的函數(shù)運算,即對每一列進行運算。

          我們可以設置axis=1來對每一行進行運算。例如我將上例設置為axis=1,結果變?yōu)椋?img data-ratio="0.9477351916376306" src="https://filescdn.proginn.com/39af2f410d6e9b649723c671a257a0ab/ca98b0217cc5f14d05dfd60b91b47145.webp" data-type="png" data-w="574" style="display: block;margin-right: auto;margin-left: auto;">

          可以看出它是使用每行的均值對nan值進行了填充。

          apply也可以另寫函數(shù)來調用:

          import pandas as pd

          df = pd.DataFrame({'A':[3,1,4,1,5,9,None,6],
                        'B':[1,2,3,None,5,6,7,8]})

          def add(x):
              return x+1

          d = df.apply(add, axis=1)
          print(df)
          print('----------')
          print(d)

          這個函數(shù)實現(xiàn)了對每一列上的數(shù)字加一:

          注意:行方向,不是指對行進行運算。

          比如:一行有[a, b, c, d],行方向運算指的是按先計算a列,然后計算b列,再計算c列,最后計算d列,所以行方向指的只是運算順序的方向。

          (不用過度糾結,記住axis=0是對列進行計算,axis=1是對行進行計算即可)

          4.2 pandas apply by 喬瞧

          首先還是要感謝【老表Max】推送的視頻及文檔,都比較精華,為初學者指明了方向。

          今天是學習pandas的第四天,最深感觸是其在處理EXCEL數(shù)據(jù)方面可為鬼斧神工,無論增、刪、查、分都高效快捷,本以為Pandas做到這種程度已經(jīng)相當棒了,但是當學到apply函數(shù)時,才發(fā)覺它超出了自己的想象力。

          Apply簡單案例如下:

          唐僧師徒加上白龍馬一行五人去參加成人考試,考試科目包含語文、數(shù)學、英語共三門,現(xiàn)在想要知道三門科目成績均不小于85分的人有哪些?

          import pandas as pd
          df = pd.DataFrame({'語文':[93,80,85,76,58],
                             '數(shù)學':[87,99,95,85,70],
                             '英語':[80,85,97,65,88]}, 
                            index=['孫悟空','豬八戒','沙和尚','唐僧','白龍馬']
                           )
          print(df)
          print('-----------')
          df1 = df.loc[df['語文'].apply(lambda x:85<=x<100)] \
              .loc[df['英語'].apply(lambda x:85<=x<100)] \
              .loc[df['數(shù)學'].apply(lambda x:85<=x<100)]
          print(df1)

          pandas pivot_table by 石墨錫

          在pandas中 除了pivot_table  還有pivot函數(shù)也一樣可以實現(xiàn)數(shù)據(jù)透視功能,前者可以看成后者的增強版。

          pivot_table函數(shù)的基本形式:

          DataFrame.pivot_table(self, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False)

          pivot_tabel對數(shù)據(jù)格式要求不高,而且支持aggfunc/fillvalue等參數(shù),所以應用更加廣泛。

          pivot_table函數(shù)的參數(shù)有values(單元格值)、index(索引)、columns(列名),這些參數(shù)組成一個數(shù)據(jù)透視表的基本結構。

          復雜一點 要用到aggfunc方法,默認是求均值(針對于數(shù)值列),當然也可以求其他統(tǒng)計量或者得到數(shù)據(jù)類型的轉換,而且可以多個統(tǒng)計方法同時使用。

          總而言之,pivot_table可以轉換各個維度去觀察數(shù)據(jù),達到“透視”的目的。

          案例說明:

          import numpy as np
          import pandas as pd
          df = pd.DataFrame({'brand': ['蘋果''三星''華為''OPPO''諾基亞''小米'],
                              'country': ['美國','韓國','中國','中國','美國','中國'],
                             'system': ['OS''Android''Harmony''Android''Android''Android'],
                             'score': [94.7,  92.896.889.388.491.2]})
          df
          # 按country進行分組,默認計算數(shù)值列的均值
          df.pivot_table(index='country')
          # 按country進行分組,除了計算score均值,另外計算每個國家出現(xiàn)的品牌個數(shù)(不重復)
          df.pivot_table(index='country',aggfunc={'score':np.mean,'brand':lambda x : len(x.unique())})
          # 按country進行分組,system作為列名,score作為表中的值(重復的取均值),取對應的數(shù)據(jù)生成新的表
          df.pivot_table(index='country',columns='system',values='score')
          # 統(tǒng)計各個國家手機的最高分 最低分  平均分,空值填充為零
          df.pivot_table(index='country',columns='system',values='score',aggfunc=[max,min,np.mean],fill_value=0)

          最后,再次給大家安利下《深入淺出Pandas:利用Python進行數(shù)據(jù)處理與分析》,將pandas相關知識講的特別齊全、詳細,最后一章節(jié)還要大量的實踐項目和案例,我在編輯本文時,對于讀者分享內(nèi)容中不確定的部分,也有查看圖書說明,深感這本圖書對于pandas使用者的好處。

          今天就到這里啦,歡迎大家在評論區(qū)留言說說你學習本文的感受或者你想推薦的其他pandas使用技巧,優(yōu)秀分享將有可能獲得贈書或者紅包獎勵哦~

          --END--


          本文所有源碼,都已在Jupyter Notebook中調試通過(Python3.7+),需要源碼的,可以掃下方二維碼,添加老表微信獲取,回復:pandas數(shù)據(jù)分析 即可。


          掃碼即可加我微信

          老表朋友圈經(jīng)常有贈書/紅包福利活動

          新玩法,以后每篇技術文章,點贊超過100+,我將在個人視頻號直播帶大家一起進行項目實戰(zhàn)復現(xiàn),快嘎嘎點贊吧!?。?/span>

          直播將在我的視頻號:老表Max 中開展,掃上方二維碼添加我微信即可查看我的視頻號。


          大家的 點贊、留言、轉發(fā)是對號主的最大支持。



          學習更多:
          整理了我開始分享學習筆記到現(xiàn)在超過250篇優(yōu)質文章,涵蓋數(shù)據(jù)分析、爬蟲、機器學習等方面,別再說不知道該從哪開始,實戰(zhàn)哪里找了

          點贊”就是對博主最大的支持 

          瀏覽 42
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  内射极品尤物 | 日日奸日日射日日舔日日干APP | 无码破解一区二区三区在线播报 | 欧洲在线观看 | 成人激情四射视频婷婷丁香网 |