欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

分享Pandas庫中的一些寶藏函數(shù)transform()

 更新時(shí)間:2021年09月02日 14:22:56   作者:Python學(xué)習(xí)與數(shù)據(jù)挖掘  
Pandas具有很多強(qiáng)大的功能,transform就是其中之一,利用它可以高效地匯總數(shù)據(jù)且不改變數(shù)據(jù)行數(shù),transform是一種什么數(shù)據(jù)操作?如果熟悉SQL的窗口函數(shù),就非常容易理解了

Pandas函數(shù)的核心功能是,既計(jì)算了統(tǒng)計(jì)值,又保留了明細(xì)數(shù)據(jù)。為了更好地理解transform和agg的不同,下面從實(shí)際的應(yīng)用場(chǎng)景出發(fā)進(jìn)行對(duì)比。

aggregation會(huì)返回?cái)?shù)據(jù)的縮減版本,而transformation能返回完整數(shù)據(jù)的某一變換版本供我們重組。這樣的transformation,輸出的形狀和輸入一致。一個(gè)常見的例子是通過減去分組平均值來居中數(shù)據(jù)。

#數(shù)據(jù)構(gòu)造
data = pd.DataFrame(
{"company":['百度', '阿里', '百度', '阿里', '百度', '騰訊', '騰訊', '阿里', '騰訊', '阿里'],
"salary":[43000, 24000, 40000, 39000, 8000, 47000, 25000, 16000, 21000, 38000],
"age":[25, 34, 49, 42, 28, 23, 45, 21, 34, 29]}) 
data
  company  salary  age
0      百度   43000   25
1      阿里   24000   34
2      百度   40000   49
3      阿里   39000   42
4      百度    8000   28
5      騰訊   47000   23
6      騰訊   25000   45
7      阿里   16000   21
8      騰訊   21000   34
9      阿里   38000   29

1、transform作用于Series

1)單個(gè)變換函數(shù)

當(dāng)transform作用于單列Series時(shí)較為簡(jiǎn)單 ,對(duì)salary列進(jìn)行transform變換我們可以傳入任意的非聚合類函數(shù),比如對(duì)工資列對(duì)數(shù)化

import pandas as pd 
import numpy  as np
# 對(duì)工資對(duì)數(shù)化
data['salary'].transform(np.log) 
0    10.668955
1    10.085809
2    10.596635
3    10.571317
4     8.987197
5    10.757903
6    10.126631
7     9.680344
8     9.952278
9    10.545341
Name: salary, dtype: float64

除了內(nèi)置函數(shù),還可以傳入lambda函數(shù)

# lambda函數(shù)
data['salary'].transform(lambda s: s+1)
0    43001
1    24001
2    40001
3    39001
4     8001
5    47001
6    25001
7    16001
8    21001
9    38001
Name: salary, dtype: int64

2)多個(gè)變換函數(shù)

也可以傳入包含多個(gè)變換函數(shù)的列表來一口氣計(jì)算出多列結(jié)果:

data['salary'].transform([np.log, lambda s: s+1, np.sqrt])
   log  <lambda>        sqrt
0  10.668955     43001  207.364414
1  10.085809     24001  154.919334
2  10.596635     40001  200.000000
3  10.571317     39001  197.484177
4   8.987197      8001   89.442719
5  10.757903     47001  216.794834
6  10.126631     25001  158.113883
7   9.680344     16001  126.491106
8   9.952278     21001  144.913767
9  10.545341     38001  194.935887

而又因?yàn)閠ransform傳入的函數(shù),在執(zhí)行運(yùn)算時(shí)接收的輸入?yún)?shù)是對(duì)應(yīng)的整列數(shù)據(jù),所以我們可以利用這個(gè)特點(diǎn)實(shí)現(xiàn)諸如數(shù)據(jù)標(biāo)準(zhǔn)化、歸一化等需要依賴樣本整體統(tǒng)計(jì)特征的變換過程:

# 利用transform進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化
data['salary'].transform(lambda s: (s - s.mean()) / s.std())
0    0.991038
1   -0.468630
2    0.760564
3    0.683739
4   -1.697825
5    1.298337
6   -0.391806
7   -1.083228
8   -0.699104
9    0.606915
Name: salary, dtype: float64

2、 transform作用于DataFrame

當(dāng)transform作用于整個(gè)DataFrame時(shí),實(shí)際上就是將傳入的所有變換函數(shù)作用到每一列中:

data.loc[:,'salary':'age'].transform(lambda s:(s-s.mean()) /s.std())
     salary       age
0  0.991038 -0.832050
1 -0.468630  0.104006
2  0.760564  1.664101
3  0.683739  0.936057
4 -1.697825 -0.520031
5  1.298337 -1.040063
6 -0.391806  1.248075
7 -1.083228 -1.248075
8 -0.699104  0.104006
9  0.606915 -0.416025

而當(dāng)傳入多個(gè)變換函數(shù)時(shí),對(duì)應(yīng)的返回結(jié)果格式類似agg中的機(jī)制,會(huì)生成MultiIndex格式的字段名

data.loc[:, 'salary': 'age'].transform([np.log, lambda s: s+1])
  salary                age         
         log <lambda>       log <lambda>
0  10.668955    43001  3.218876       26
1  10.085809    24001  3.526361       35
2  10.596635    40001  3.891820       50
3  10.571317    39001  3.737670       43
4   8.987197     8001  3.332205       29
5  10.757903    47001  3.135494       24
6  10.126631    25001  3.806662       46
7   9.680344    16001  3.044522       22
8   9.952278    21001  3.526361       35
9  10.545341    38001  3.367296       30

而且由于作用的是DataFrame,還可以利用字典以鍵值對(duì)的形式,一口氣為每一列配置單個(gè)或多個(gè)變換函數(shù):

(data.loc[:, 'salary': 'age']
.transform({'age': lambda s: (s - s.mean()) / s.std(),
                'salary': [np.log, np.sqrt]}))
   age     salary            
   <lambda>        log        sqrt
0 -0.832050  10.668955  207.364414
1  0.104006  10.085809  154.919334
2  1.664101  10.596635  200.000000
3  0.936057  10.571317  197.484177
4 -0.520031   8.987197   89.442719
5 -1.040063  10.757903  216.794834
6  1.248075  10.126631  158.113883
7 -1.248075   9.680344  126.491106
8  0.104006   9.952278  144.913767
9 -0.416025  10.545341  194.935887

3、transform作用于groupby分組后

在原來的數(shù)據(jù)中,我們知道了如何求不同公司的平均薪水,假如需要在原數(shù)據(jù)集中新增一列salary_mean,代表該公司的平均薪水,該怎么實(shí)現(xiàn)呢?

data['salary_mean'] = data.groupby('company')[['salary']].transform('mean')
data 
  company  salary  age   salary_mean
0      百度   43000   25  30333.333333
1      阿里   24000   34  29250.000000
2      百度   40000   49  30333.333333
3      阿里   39000   42  29250.000000
4      百度    8000   28  30333.333333
5      騰訊   47000   23  31000.000000
6      騰訊   25000   45  31000.000000
7      阿里   16000   21  29250.000000
8      騰訊   21000   34  31000.000000
9      阿里   38000   29  29250.000000

通過上面的數(shù)據(jù)可以看出,利用transform輸出既得到了統(tǒng)計(jì)數(shù)據(jù),形狀也沒有變化。

當(dāng)然,也可對(duì)多個(gè)數(shù)據(jù)列進(jìn)行計(jì)算

data.groupby('company')[['salary', 'age']].transform('mean')
         salary   age
0  30333.333333  34.0
1  29250.000000  31.5
2  30333.333333  34.0
3  29250.000000  31.5
4  30333.333333  34.0
5  31000.000000  34.0
6  31000.000000  34.0
7  29250.000000  31.5
8  31000.000000  34.0
9  29250.000000  31.5

我們也可以用map函數(shù)實(shí)現(xiàn)類似的功能,但是稍微復(fù)雜點(diǎn),但是有助于我們理解transform的含義。

avg_dict = data.groupby('company')['salary'].mean().to_dict()
avg_dict#得到了一個(gè)平均工資的字典
{'百度': 30333.333333333332, '騰訊': 31000.0, '阿里': 29250.0}
#利用map函數(shù),將得到的字典映射到對(duì)應(yīng)的列
data['salary_mean'] = data['company'].map(avg_dict)
data
company  salary  age   salary_mean
0      百度   43000   25  30333.333333
1      阿里   24000   34  29250.000000
2      百度   40000   49  30333.333333
3      阿里   39000   42  29250.000000
4      百度    8000   28  30333.333333
5      騰訊   47000   23  31000.000000
6      騰訊   25000   45  31000.000000
7      阿里   16000   21  29250.000000
8      騰訊   21000   34  31000.000000
9      阿里   38000   29  29250.000000

以圖解的方式來看看進(jìn)行g(shù)roupby后transform的實(shí)現(xiàn)過程(公司列包含ABC,salary列為每個(gè)員工的工資明細(xì)):

圖片

上圖中的大方框是transform和agg 所不一樣的地方,對(duì)agg而言,會(huì)計(jì)算并聚合得到 A,B,C 公司對(duì)應(yīng)的均值并直接返回,每個(gè)公司一條數(shù)據(jù),但對(duì)transform而言,則會(huì)對(duì)每一條數(shù)據(jù)求得相應(yīng)的結(jié)果,同一組內(nèi)的樣本會(huì)有相同的值,組內(nèi)求完均值后會(huì)按照原索引的順序返回結(jié)果。

以上就是分享Pandas中的一些寶藏函數(shù)transform()的詳細(xì)內(nèi)容,更多關(guān)于Pandas函數(shù)transform()的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python獲取圖像中像素點(diǎn)坐標(biāo)實(shí)例代碼

    Python獲取圖像中像素點(diǎn)坐標(biāo)實(shí)例代碼

    當(dāng)我們處理圖像的時(shí)候避免不了要對(duì)訪問,或是讀取某一個(gè)像素點(diǎn)的值,下面這篇文章主要給大家介紹了關(guān)于利用Python如何獲取圖像中像素點(diǎn)坐標(biāo)的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • python 星號(hào)(*)的多種用途

    python 星號(hào)(*)的多種用途

    這篇文章主要介紹了python 星號(hào)(*)的多種用途,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • Python實(shí)現(xiàn)批量把SVG格式轉(zhuǎn)成png、pdf格式的代碼分享

    Python實(shí)現(xiàn)批量把SVG格式轉(zhuǎn)成png、pdf格式的代碼分享

    這篇文章主要介紹了Python實(shí)現(xiàn)批量把SVG格式轉(zhuǎn)成png、pdf格式的代碼分享,本文代碼需要引用一個(gè)第三方模塊cairosvg,需要的朋友可以參考下
    2014-08-08
  • python 字典 按key值大小 倒序取值的實(shí)例

    python 字典 按key值大小 倒序取值的實(shí)例

    今天小編就為大家分享一篇python 字典 按key值大小 倒序取值的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • matplotlib基礎(chǔ)繪圖命令之imshow的使用

    matplotlib基礎(chǔ)繪圖命令之imshow的使用

    這篇文章主要介紹了matplotlib基礎(chǔ)繪圖命令之imshow的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • numpy數(shù)組疊加的實(shí)現(xiàn)示例

    numpy數(shù)組疊加的實(shí)現(xiàn)示例

    本文主要介紹了numpy數(shù)組疊加的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 使用pygame寫一個(gè)古詩詞填空通關(guān)游戲

    使用pygame寫一個(gè)古詩詞填空通關(guān)游戲

    這篇文章主要介紹了使用pygame寫一個(gè)古詩詞填空通關(guān)游戲,之前寫的詩詞填空的游戲支持python2,現(xiàn)在對(duì)程序進(jìn)行了修改,兼容支持python2和python3,需要的朋友可以參考下
    2019-12-12
  • python實(shí)現(xiàn)單向鏈表詳解

    python實(shí)現(xiàn)單向鏈表詳解

    這篇文章主要介紹了python實(shí)現(xiàn)單向鏈表詳解,分享了相關(guān)代碼示例,每一步操作前都有簡(jiǎn)單分析,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • tensorflow從ckpt和從.pb文件讀取變量的值方式

    tensorflow從ckpt和從.pb文件讀取變量的值方式

    這篇文章主要介紹了tensorflow從ckpt和從.pb文件讀取變量的值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python使用matplotlib:subplot繪制多個(gè)子圖的示例

    python使用matplotlib:subplot繪制多個(gè)子圖的示例

    這篇文章主要介紹了python使用matplotlib:subplot繪制多個(gè)子圖的示例,幫助大家更好的利用python繪制圖像,感興趣的朋友可以了解下
    2020-09-09

最新評(píng)論