前言分組原理
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比鶴山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式鶴山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋鶴山地區(qū)。費用合理售后完善,十年實體公司更值得信賴。
核心:
1.不論分組鍵是數(shù)組、列表、字典、Series、函數(shù),只要其與待分組變量的軸長度一致都可以傳入groupby進行分組。
2.默認axis=0按行分組,可指定axis=1對列分組。
對數(shù)據(jù)進行分組操作的過程可以概括為:split-apply-combine三步:
1.按照鍵值(key)或者分組變量將數(shù)據(jù)分組。
2.對于每組應用我們的函數(shù),這一步非常靈活,可以是python自帶函數(shù),可以是我們自己編寫的函數(shù)。
3.將函數(shù)計算后的結果聚合。
1 分組模式及其對象
1.1 分組的一般模式
三個要素:分組依據(jù)、數(shù)據(jù)來源、操作及其返回結果
df.groupby(分組依據(jù))[數(shù)據(jù)來源].使用操作
1.2 分組依據(jù)的本質
1.3Groupby 對象
通過 ngroups 屬性,可以訪問分為了多少組:
通過 groups 屬性,可以返回從 組名映射到 組索引列表的字典:
當 size 作為 DataFrame 的屬性時,返回的是表長乘以表寬的大小,但在 groupby 對象上表示統(tǒng)計每個組的 元素個數(shù):
通過 get_group 方法可以直接獲取所在組對應的行,此時必須知道組的具體名字:
1.4 分組的三大操作
分組的三大操作:聚合、變換和過濾
2.聚合函數(shù)
2.1內置聚合函數(shù)
包括如下函數(shù): max/min/mean/median/count/all/any/idxmax/idxmin/mad/nunique/skew/quantile/sum/std/var/sem/size/prod
2.2agg 方法
【a】使用多個函數(shù)
當使用多個聚合函數(shù)時,需要用列表的形式把內置聚合函數(shù)的對應的字符串傳入,先前提到的所有字符串都是合法的。
【b】對特定的列使用特定的聚合函數(shù)
對于方法和列的特殊對應,可以通過構造字典傳入 agg 中實現(xiàn),其中字典以列名為鍵,以聚合字符串或字符串列表為值。
【c】使用自定義函數(shù)
在 agg 中可以使用具體的自定義函數(shù),需要注意傳入函數(shù)的參數(shù)是之前數(shù)據(jù)源中的列,逐列進行計算
【d】聚合結果重命名 如果想要對結果進行重命名,只需要將上述函數(shù)的位置改寫成元組,元組的第一個元素為新的名字,第二個位置為原來的函數(shù),包括聚合字符串和自定義函數(shù)
3 變換和過濾
3.1 變換函數(shù)與 transform 方法
變 換 函 數(shù) 的 返 回 值 為 同 長 度 的 序 列, 最 常 用 的 內 置 變 換 函 數(shù) 是 累 計 函 數(shù):cum- count/cumsum/cumprod/cummax/cummin ,它們的使用方式和聚合函數(shù)類似,只不過完成的是組內 累計操作。
3.2 組索引與過濾
過濾在分組中是對于組的過濾,而索引是對于行的過濾
組過濾作為行過濾的推廣,指的是如果對一個組的全體所在行進行統(tǒng)計的結果返回 True 則會被保留,F(xiàn)alse 則該組會被過濾,最后把所有未被過濾的組其對應的所在行拼接起來作為 DataFrame 返回。
在 groupby 對象中,定義了 filter 方法進行組的篩選,其中自定義函數(shù)的輸入?yún)?shù)為數(shù)據(jù)源構成的 DataFrame 本身,在之前例子中定義的 groupby 對象中,傳入的就是 df[['Height', 'Weight']] ,因此所有表方法和屬性 都可以在自定義函數(shù)中相應地使用,同時只需保證自定義函數(shù)的返回為布爾值即可。
4 跨列分組
4.1 apply 的引入
4.2 apply 的使用
在設計上,apply 的自定義函數(shù)傳入?yún)?shù)與 filter 完全一致,只不過后者只允許返回布爾值
【a】標量情況:結果得到的是 Series ,索引與 agg 的結果一致
【b】Series 情況:得到的是 DataFrame ,行索引與標量情況一致,列索引為 Series 的索引
【c】DataFrame 情況:得到的是 DataFrame ,行索引最內層在每個組原先 agg 的結果索引上,再加一層返 回的 DataFrame 行索引,同時分組結果 DataFrame 的列索引和返回的 DataFrame 列索引一致
把之前教程的地址移過來
合并帖子的內容:【整理】【多圖詳解】如何在Windows下開發(fā)Python:在cmd下運行Python腳本+如何使用Python Shell(command line模式和GUI模式)+如何使用Python IDE
為出版而整理:每章都加了摘要,每章都完善了架構。
整理章節(jié)的架構;整理第一章的內容
添加Python學習資料目錄
前言
1. 本文目的
2. 看此文之前你所要掌握的知識
1. Python簡介
1.1. 什么是Python
1.1.1. Python這個單詞的本意是蟒蛇
1.1.2. Python是一種計算機語言
1.1.3. 作為計算機語言的Python的各種叫法的含義
1.1.3.1. Python是一種腳本語言
1.1.3.2. Python是一種交互性的語言
1.1.3.3. Python是一門解釋性的語言
1.1.3.4. Python是一種面向對象的語言
1.1.3.5. Python是一種高級語言
1.2. Python能干什么
1.3. Python的特點
1.3.1. 作為解釋性語言的Python的優(yōu)缺點
1.3.1.1. Python的優(yōu)點
1.3.1.2. Python的缺點
1.3.2. Python語言自身的特點
1.4. Python相關的必備知識
1.4.1. Python文件的后綴是py
1.4.2. Python的縮寫和簡稱
1.4.3. Python的官網(wǎng)
1.4.4. Python的logo圖案
2. 選擇并下載合適的版本的Python
2.1. 為何要注意選擇合適版本的Python
2.2. 如何選擇正確版本的Python
2.2.1. 明確當前所處平臺版本的信息
2.2.2. 選擇可用和速度快的下載源
2.2.3. 選擇合適的版本的Python
3. 如何安裝Python
3.1. 如何在Windows系統(tǒng)中安裝Python
3.1.1. 在Win7中安裝Python
3.2. 如何在Linux系統(tǒng)中安裝Python
3.2.1. 在Ubuntu中安裝Python
3.3. 如何在Mac中安裝Python
4. 選擇合適的Python開發(fā)環(huán)境
4.1. 如何在Windows環(huán)境下開發(fā)Python
4.1.1. Python的最原始的開發(fā)方式是什么樣的
4.1.1.1. 找個文本編輯器,新建個.py文件,寫上Python代碼
4.1.1.2. 打開Windows的cmd,并且切換到對應的python腳本所在目錄
4.1.1.2.1. 方法1:手動打開cmd,并cd到對應路徑
4.1.1.2.2. 方法2:通過Notepad++的Open current dir cmd
4.1.1.3. 在cmd中去運行你的Python腳本(.py文件)
4.1.2. 利用Python的shell進行交互式開發(fā)又是什么樣的
4.1.2.1. 命令行版本的Python Shell – Python (command line)
4.1.2.2. 帶圖形界面的Python Shell – IDLE (Python GUI)
4.1.2.3. 關于(command line或GUI版本的)Python Shell的用途
4.1.3. 利用第三方Python的IDE進行Python開發(fā)又是怎么回事
4.1.3.1. 為何會有Python的IDE
4.1.3.2. 目前常見的一些Python的IDE
4.1.3.3. Python的IDE和Python代碼編輯器,Windows的cmd,等的關系
4.1.3.4. 使用IDE時所遇到的一些常見的問題
4.1.3.4.1. IDE只能夠打開了文件,并不代表就已經(jīng)在shell中運行了該文件
4.1.3.4.2. 需要注意,確保有可以運行的Python起始部分的代碼
4.1.4. 總結:到底使用哪種環(huán)境去開發(fā)Python
4.1.4.1. 對初學者的建議:如何選用Python的開發(fā)環(huán)境
4.1.5. 如何在Windows環(huán)境下使用Python腳本
4.1.5.1. 如何在Windows下的cmd中運行BlogsToWordpress.py
4.2. 如何在Linux環(huán)境下開發(fā)Python
4.3. 如何在Mac環(huán)境下開發(fā)Python
5. Python的基本語法和基礎知識
5.1. 一張圖片入門Python
5.2. Python中的2.x版本和3.x版本
5.3. Python文件編碼聲明
5.4. Python中的縮進
5.5. Python中基本變量的聲明和定義
5.5.1. Python中變量的作用域
5.5.2. Python中變量與C語言中的變量對比
5.6. Python中的分支結構
5.7. Python中的函數(shù)
5.8. Python中的面向對象編程
6. 繼續(xù)學習Python的思路和方法
6.1. 如何繼續(xù)深入學習Python
6.2. 如何利用Python相關資源
6.2.1. 如何利用Python自帶的手冊
6.2.2. 如何利用一些在線的Python資源
7. Python常見問題及解答
常見問題
7.1. 在window的cmd中運行python結果卻調用了文本編輯器去打開了,而不是去調用Python解析器去運行python文件
8. Python相關資源
參考書目
插圖清單
4.1. 在Windows下的cmd下面運行Python腳本的樣子
4.2. 開始菜單中找到的Python (Command Line)
4.3. Python (Command Line)的界面
4.4. 動畫演示如何在Windows的cmd中運行Python腳本BlogsToWordpress.py
4.5. 在Mac下的Terminal中運行Python腳本:BlogsToWordpress
5.1. Quick Python Script Explanation
5.2. 一張圖入門Python中文版
7.1. 安裝Python時選擇Register Extensions
范例清單
4.1. 舉例:用Python的IDLE去做URL解碼
公式清單
4.1. 什么是IDE
4.2. 什么是Python的IDE
一、前言
在python中,函數(shù)參數(shù)的定義和傳遞有以下幾種方式:
語法
意義 ?
def func(name)
普通參數(shù),可以根據(jù)位置匹配,也可以根據(jù)key來匹配 ?
def func(name=value)
默認參數(shù),當參數(shù)沒有傳遞時,使用默認值
def func(*iteratable)
將所有剩下的未匹配的參數(shù)收集至一個tuple中
def func(**dictionary)
將剩下未匹配的參數(shù)收集值一個dict中
def func(*, name)
必須使用key來匹配參數(shù)
def func(*other, name)
必須使用key來匹配參數(shù)
func(value)
函數(shù)調用,參數(shù)值按傳遞的參數(shù)順序匹配 ?
func(name=value)
函數(shù)調用,參數(shù)值根據(jù)key來匹配 ?
func(*iteratable)
函數(shù)調用,將iteratable容器中的參數(shù)展開,按位置匹配對應的函數(shù)參數(shù) ?
func(**dictionary)
函數(shù)調用,將dict中的參數(shù)展開,按key值來匹配對應的函數(shù)參數(shù) ?
在python中,參數(shù)可以按照順序傳遞,在調用函數(shù)時,參數(shù)的值按照傳遞的順序,從左到右依次匹配。并且還可以給參數(shù)傳遞默認值,這都很好理解,因為在C、C++、Java等許多語言中,函數(shù)的參數(shù)傳遞都是按照這種方法來傳遞的。
但python的參數(shù)定義和傳遞除了按照順序傳遞以及可以給默認值外,它還有其它的一些特點,在進一步講解之前,首先說明python中函數(shù)調用中參數(shù)匹配的順序:
按照順序,給沒有key的參數(shù)賦值,意味著傳遞參數(shù)時,需按順序匹配的參數(shù)必須出現(xiàn)在按key匹配的參數(shù)之前;
給按照key匹配的參數(shù)賦值;
將多余的按照順序匹配但未匹配的參數(shù)值歸入*name的tuple中;
將多余未匹配上的按照key進行匹配的參數(shù)值歸入**name的dict對象中;
將為匹配上的且具有默認值的參數(shù)賦默認值
二、按key匹配參數(shù)
對于C、C++這種語言,在調用函數(shù)時,系統(tǒng)會首先將函數(shù)地址壓入堆棧,其次按參數(shù)的從右往左的順序,一次壓入堆棧。因此,C、C++這種語言它們只支持按順序匹配形參。而python的做法不同,參數(shù)除了可以按順序匹配,還可以按照參數(shù)名稱來匹配。如:
def func(name, age):
print(name, age)
對于這個函數(shù),以下的調用時等價的:
func('rechar', 27) ? ?#按順序匹配
func(name = 'rechar', age = 27) ? ?#按參數(shù)名稱匹配,在運行時告訴系統(tǒng)參數(shù)name的值為‘rechar’,age的值為27
func(age = 27, name = 'rechar') ? ?#按參數(shù)名稱匹配
func('rechar', age = 27) ? ?#name是按順序匹配,age按名稱匹配
在python中,當按照參數(shù)名稱進行匹配參數(shù)是,參數(shù)傳遞的順序是可以任意的,不要求按照函數(shù)定義中參數(shù)的順序進行傳遞。在使用名稱匹配時,如果需要混合使用按順序匹配規(guī)則,則按順序匹配的參數(shù)必須出現(xiàn)在按key匹配的參數(shù)前,否則會報錯:
func(name = 'rechar', 27)
以上調用會報如下錯誤:
三、函數(shù)定義中的”*name“
python在給按順序匹配和按key匹配的參數(shù)賦完值后,如果發(fā)現(xiàn)調用者傳入的參數(shù)仍有未匹配上的會發(fā)生什么情況呢?看一下下面的例子:
func('rechar', 27, 32)
運行時我們看到如下錯誤:
Traceback (most recent call last):
File "E:\tmp\tt.py", line 5, in module
func('rechar', 27, 32)
TypeError: func() takes 2 positional arguments but 3 were given
哦,python會抱怨我們傳遞的參數(shù)太多了。那如果確實在一些情況下,我們無法保證傳遞的參數(shù)數(shù)量一定和函數(shù)需要的參數(shù)數(shù)相等怎么辦呢?這是就是*iterable這種參數(shù)該登場的時候了,假如在定義函數(shù)定義是,我們增加了一個參數(shù),這個參數(shù)以一個”*“開始,那么這個參數(shù)實際上是一個tuple類型。假如傳遞的參數(shù)比需要的多,那那些多余的參數(shù)會被放入這個tuple中。例如,
def func(name, age, *other):
print(name, age, other)
那么,
func('rechar', 27, 32)
這個調用的輸出如下:
rechar 27 (32,)
四、函數(shù)定義中的”**name“
python在將所有未匹配上的非按名稱匹配的參數(shù)裝入?yún)?shù)中的tuple之后,假如還有未匹配上的按名稱匹配的參數(shù)那情況會怎樣呢?首先來看一下下面的示例:
def func(name, age):
print(name, age)
func(name = 'rechar', age = 27, pay='1800')
執(zhí)行時,python又抱怨了:
Traceback (most recent call last):
File "E:\tmp\tt.py", line 5, in module
func(name = 'rechar', age = 27, pay='1800')
TypeError: func() got an unexpected keyword argument 'pay'
它說func這個函數(shù)沒有名稱為”pay“的參數(shù),這種情況或許出現(xiàn)在我們函數(shù)重構之后,原來函數(shù)時有這個參數(shù)的。而這個函數(shù)調用可能在別處沒有被修改。假設即使給了”pay“這個參數(shù),程序的正確性不受影響,沒錯,這就是”**name“參數(shù)的用武之地了。
假如在函數(shù)定義中,給函數(shù)增加一個以”**“開頭的參數(shù),那么這個參數(shù)實際上是一個dict對象,它會將參數(shù)調用中所有沒有被匹配的按名稱傳遞的參數(shù)都放入這個dict中。例如,
def func(name, age,**other):
print(name, age, other)
func(name = 'rechar', age = 27, pay='1800')
那么運行結果輸出,
rechar 27 {'pay': '1800'}
看到了吧,這里的other就將沒有匹配的”pay=‘1800’“收入囊中了。
五、規(guī)定調用必須按名稱匹配
當我們在定義函數(shù)時,如果第一個參數(shù)就是”*name“參數(shù),那么可想而知,我們無法使用按順序匹配的方式傳遞,因為所有的按順序傳遞的參數(shù)值最終的歸宿都會是這里的tuple當中。而為了給后續(xù)的參數(shù)傳遞值,我們只能使用按名稱匹配的方法。
六、”**“參數(shù)只能出現(xiàn)在最后一個形參之后
想想為什么?其實很好理解,因為出現(xiàn)在”**“形參之后的形參,無論使用按順序傳遞還是按名稱傳遞,最終都無法到達參數(shù)值真正應該需要到的地方。所以python規(guī)定,如果需要”**“參數(shù),那它必須是最后一個形參。否則python會報語法錯誤。
七、函數(shù)調用中的”*“
在表格中我們看到了有func(*iteratable)的調用,這個調用的意思是,iteratable必須是一個可迭代的容器,比如list、tuple;作為參數(shù)傳遞值,它最終傳遞到函數(shù)時,不是以一個整體出現(xiàn),而是將其中的元素按照順序傳遞的方式,一次賦值給函數(shù)的形參。例如,
li = ['rechar', 27]
func(*li)
這個函數(shù)調用與
func('rechar', 27)
是等價的。
八、函數(shù)調用中的”**“
知道”*“在函數(shù)調用中的效果之后,也就很好理解”**“的作用了。它是將傳遞進來的dict對象分解,每一個元素對應一個按名稱傳遞的參數(shù),根據(jù)其中的key對參數(shù)進行賦值。
WSGI(Web Server Gateway Interface) 的任務就是把上面的數(shù)據(jù)在 http server 和 python 程序之間簡單友好地傳遞。它是一個標準,被定義在 PEP 333 。需要 http server 和 python 程序都要遵守一定的規(guī)范,實現(xiàn)這個標準的約定內容,才能正常工作。
application端定義非常簡單,它只要求開發(fā)者實現(xiàn)一個函數(shù)來響應HTTP請求。
這個函數(shù)就是一個符合WSGI標準的一個HTTP處理函數(shù),它接收兩個參數(shù):
envrion 和 start_response 這兩個參數(shù)由服務端提供,PEP333里給出了一個wsgi server的簡單實現(xiàn):
或者,python中也內置了一個WSGI服務器模塊 wsgiref , 通過這個模塊就可以快速實現(xiàn)了個WSGI Server來測試我們的 application :
可以看到結果為 wsgi_client.py 中定義的 hello world
Flask框架中的一個核心庫 werkzeug 其實就是Python的WSGI規(guī)范的實用函數(shù)庫
一 前言 ?
最近一直在做開發(fā)相關的工作--基于Django的web 平臺,其中需要從model層傳輸數(shù)據(jù)到view 層做數(shù)據(jù)展示或者做業(yè)務邏輯處理。我們采用通用的Json格式--Json(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,易于閱讀和程序解析。
二 認識Json
2.1 Json 結構
常見的Json格式為 “名稱/值”對的集合,其中 值可以是對象,列表,字典,字符串等等。比如
backup_data?=?{"back_to_host":?"dbbk0",
"ip_address":?"10.10.20.3",
"host_name":?"rac4",
"port":?3306}
2.2 使用Json
Python的Json模塊序列化與反序列化的過程分別是 編碼和解碼。這兩個過程涉及到兩組不同的函數(shù)
編碼 把一個Python對象編碼轉換成Json字符串,json.dumps(data)/json.dump(data,file_handler)
解碼 把Json格式字符串解碼轉換成Python對象,json.loads(data)/json.load(file_handler)
在python中要使用Json模塊做相關操作,必須先導入:
import Json
2.3 主要函數(shù)
編碼函數(shù)主要有 json.dumps(data)/json.dump(data,file_handler)
json.dumps()的參數(shù)是將python對象轉換為字符串,如使用json.dumps序列化的對象json_dumps=json.dumps({'a':1, 'b':2}) ,json_dumps='{"b": 2, "a": 1}'
json.dump 是將內置類型序列化為json對象后寫入文件。
解碼函數(shù)主要由json.loads(data)/json.load(file_handler) ?
json.loads的參數(shù)是內存對象,把Json格式字符串解碼轉換成Python對象,json_loads=json.loads(d_json) ?#{ b": 2, "a": 1},使用load重新反序列化為dict
json.load()的參數(shù)針對文件句柄,比如本地有一個文件/tmp/test.json ?json_load=json.load(open('/tmp/test.json'))
具體案例參考如下:
In?[3]:?data={"back_to_host":?"rac1",
...:?"ip_address":?"10.215.20.3",
...:?"host_name":?"rac3",
...:?"port":?3306}
In?[7]:?json_str=json.dumps(data)
In?[8]:?print json_str
{"ip_address":?"10.215.20.3",?"back_to_host":?"rac1",?"host_name":?"rac3",?"port":?3306}
In?[9]:?json_loads=json.load(json_str)
---------------------------------------------------------------------------
AttributeError Traceback?(most recent?call?last)
ipython-input-9-180506f16431?in?module()
----?1 json_loads=json.load(json_str)
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.pyc?in?load(fp,?encoding,?cls,?object_hook,?parse_float,?parse_int,?parse_constant,?object_pairs_hook,?**kw)
284
285?""
注意 從上面的報錯信息來看 json.loads 傳參是字符串類型,并不是文件句柄,沒有 read()屬性。
In?[10]:?json_loads=json.loads(json_str)
In?[11]:?print json_loads
{u'back_to_host':?u'rac1',?u'ip_address':?u'10.215.20.3',?u'host_name':?u'rac3',?u'port':?3306}
In?[12]:?type(json_loads)
Out[12]:?dict
In?[13]:?type(json_str)
Out[13]:?str
利用dump 將數(shù)據(jù)寫入 dump.json
In?[17]:?with open('/tmp/dump.json','w')?as f:
...:?json.dump(json_str,f)
...:
yangyiDBA:~?yangyi$ cat /tmp/dump.json
"{\"ip_address\": \"10.10.20.3\", \"back_to_host\": \"rac1\", \"host_name\": \"rac3\", \"port\": 3306}"
yangyiDBA:~?yangyi$
利用json.load 將dump.sjon的數(shù)據(jù)讀出來并賦值給 data?
In?[18]:?with open('/tmp/dump.json','r')?as f:
...:?data=json.load(f)
...:
In?[19]:?print data
{"ip_address":?"10.10.20.3",?"back_to_host":?"rac1",?"host_name":?"rac3",?"port":?3306}
三 小結
本文算是一篇學習筆記,主要對比了json.loads/json.load ?, json.dumps/ json.dump 的使用差異 ,方便以后更好的使用json 。
以上為本次分享內容,感謝觀看。
網(wǎng)站欄目:python函數(shù)前言,Python函數(shù)語句
本文網(wǎng)址:http://sd-ha.com/article18/dssgogp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供虛擬主機、小程序開發(fā)、關鍵詞優(yōu)化、微信小程序、軟件開發(fā)、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)