小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 阿明哥哥資料區(qū) 2022-08-09 發(fā)布于上海
  • 一、前言

  • 二、本文概要

  • 三、pandas merge by 修羅閃空

    • 3.1 merge函數(shù)用途

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

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

  • 四、pandas apply by pluto、喬瞧

    • 4.1 pandas apply by pluto

    • 4.2 pandas apply by 喬瞧

  • pandas pivot_table by 石墨錫

一、前言

廢話(huà)不多說(shuō),開(kāi)始今天的學(xué)習(xí)吧,三個(gè)pandas中經(jīng)典中經(jīng)典的函數(shù)使用分享,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)本文,支持作者。

二、本文概要

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

三、pandas merge by 修羅閃空

3.1 merge函數(shù)用途

pandas中的merge()函數(shù)類(lèi)似于SQL中join的用法,可以將不同數(shù)據(jù)集依照某些字段(屬性)進(jìn)行合并操作,得到一個(gè)新的數(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ù)說(shuō)明:

    • how:默認(rèn)為inner,可設(shè)為inner/outer/left/right;

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

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

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

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

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

    • sort:根據(jù)連接鍵對(duì)合并后的數(shù)據(jù)進(jìn)行排列,默認(rèn)為T(mén)rue;

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

3.3 merge函數(shù)的應(yīng)用

3.3.1 merge一般應(yīng)用

import pandas as pd

# 定義資料集并打印出來(lái)
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)
圖片
  • 單個(gè)字段連接
# 依據(jù)key1 column合并,并打印
res = pd.merge(left, right, on='key1')
print(res)
  • 多字段連接
# 依據(jù)key1和key2 column進(jìn)行合并,并打印出四種結(jié)果['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為主進(jìn)行合并
print(res)

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

3.3.2 merge進(jìn)階應(yīng)用

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

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

圖片
# 自定義indicator column的名稱(chēng)并打印出
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進(jìn)行合并,how='outer',并打印
res = pd.merge(left, right, left_index=True, right_index=True, how='outer')
print(res)

# 依據(jù)左右數(shù)據(jù)集的index進(jìn)行合并,how='inner',并打印
res = pd.merge(left, right, left_index=True, right_index=True, how='inner')
print(res)
  • 解決overlapping的問(wèn)題
# 解決overlapping的問(wèn)題
# 定義資料集
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的問(wèn)題
# 比如將上面兩個(gè)合并時(shí),age重復(fù)了,則可通過(guò)suffixes設(shè)置,以此保證不重復(fù),不同名(默認(rèn)會(huì)在重名列名后加_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中極其好用的一個(gè)函數(shù),它可以對(duì)dataframe在行或列方向上進(jìn)行批量化處理,從而大大簡(jiǎn)化數(shù)據(jù)處理的過(guò)程。

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

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

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

在運(yùn)算函數(shù)并不復(fù)雜的情況下,第一個(gè)參數(shù)通常使用lambda函數(shù)。當(dāng)函數(shù)復(fù)雜時(shí)可以另外寫(xiě)一個(gè)函數(shù)來(lái)調(diào)用。下面通過(guò)一個(gè)實(shí)例來(lái)說(shuō)明:

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ù):圖片

可以看到上面代碼通過(guò)apply對(duì)nan值進(jìn)行了均值填充,填充的為nan值所在列的均值。

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

我們可以設(shè)置axis=1來(lái)對(duì)每一行進(jìn)行運(yùn)算。例如我將上例設(shè)置為axis=1,結(jié)果變?yōu)椋?img doc360img-src='http://image109.360doc.com/DownloadImg/2022/08/0918/250046544_7_20220809064334710.png' data-ratio='0.9477351916376306' data-type='png' data-w='574' _width='-30px' src='http://image109.360doc.com/DownloadImg/2022/08/0918/250046544_7_20220809064334710.png' alt='圖片'>

可以看出它是使用每行的均值對(duì)nan值進(jìn)行了填充。

apply也可以另寫(xiě)函數(shù)來(lái)調(diào)用:

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)

這個(gè)函數(shù)實(shí)現(xiàn)了對(duì)每一列上的數(shù)字加一:圖片

注意:行方向,不是指對(duì)行進(jìn)行運(yùn)算。

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

(不用過(guò)度糾結(jié),記住axis=0是對(duì)列進(jìn)行計(jì)算,axis=1是對(duì)行進(jìn)行計(jì)算即可)

4.2 pandas apply by 喬瞧

Apply簡(jiǎn)單案例如下:

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

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

pandas pivot_table by 石墨錫

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

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對(duì)數(shù)據(jù)格式要求不高,而且支持aggfunc/fillvalue等參數(shù),所以應(yīng)用更加廣泛。

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

復(fù)雜一點(diǎn) 要用到aggfunc方法,默認(rèn)是求均值(針對(duì)于數(shù)值列),當(dāng)然也可以求其他統(tǒng)計(jì)量或者得到數(shù)據(jù)類(lèi)型的轉(zhuǎn)換,而且可以多個(gè)統(tǒng)計(jì)方法同時(shí)使用。

總而言之,pivot_table可以轉(zhuǎn)換各個(gè)維度去觀(guān)察數(shù)據(jù),達(dá)到“透視”的目的。

案例說(shuō)明:

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

end

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多