摘要:如何遍歷當中的行現(xiàn)有一個數(shù)據(jù)框的期望輸出現(xiàn)在我想遍歷這個數(shù)據(jù)框的每一行,在每一行當中我想通過列名訪問第一行的每一個元素,例如,實現(xiàn)以下效果這里推送一個非常好用的函數(shù)這個函數(shù)同時返回索引和行對象的生成器可以直接進行遍歷如何理解當中的函數(shù)若要理
如何遍歷pandas當中的行
現(xiàn)有一個數(shù)據(jù)框pandas的dataframe:
import pandas as pd inp = [{"c1":10, "c2":100}, {"c1":11,"c2":110}, {"c1":12,"c2":120}] df = pd.DataFrame(inp) print df
期望輸出
c1 c2 0 10 100 1 11 110 2 12 120
現(xiàn)在我想遍歷這個數(shù)據(jù)框的每一行, 在每一行當中我想通過列名訪問第一行的每一個元素,例如,實現(xiàn)以下效果:
for row in df.rows: print row["c1"], row["c2"]
這里推送一個非常好用的函數(shù):
iterrows()
這個函數(shù)同時返回 索引和行對象的生成器可以直接進行遍歷
In [18]: for index, row in df.iterrows(): ....: print row["c1"], row["c2"] ....: 10 100 11 110 12 120如何理解python當中的yield函數(shù)
若要理解python當中的(yield)函數(shù),首先必須理解什么是生成器(generators),在理解生成器之前必須先理解迭代器(iterators).
迭代器當你創(chuàng)建一個列表list,可以一個元素一個元素逐個讀他,這樣的操作稱為迭代 interation :
>>> mylist = [1, 2, 3] >>> for i in mylist: ... print(i) 1 2 3
這里mylist就稱之為一個可迭代對象,當你使用列表推導時(list comprehension),可以生成一個列表,列表推導的方法如下所示:
>>> mylist = [x*x for x in range(3)] >>> for i in mylist: ... print(i) 0 1 4
所有可以用for ... in ... 操作的對象稱之為可迭代對象.例如字符串列表文件集合等等.
++列表這類可迭代對象還比較方便,但缺點就是需要存儲在內存中的對象非常多,在值非常多的時候如果都使用這種方式,不是很好++.
生成器生成器也是迭代器的一種,是一種只能遍歷一次的可迭代對象.
生成器不需要在內存當中存儲所有的值,
他們是即時生成值,性能更快.
例如:
>>> mygenerator = (x*x for x in range(3)) >>> for i in mygenerator: ... print(i) 0 1 4
可以看到,除了使用[]替代()之外,其它都是一樣的,但是以下的用法就是不允許的:
for i in mygenerator
實際上他們先生成0,然后忘掉0,再生成1,丟棄1,一直往下,一個接一個進行處理.
Yield函數(shù)yield 函數(shù)有點像Return,區(qū)別在于這個函數(shù)返回的是迭代器.
例如:
def createGenerator(): mylist = range(3) print u"this will be executed only when for ... in ..called only once" for i in mylist: yield i*i mygenerator = createGenerator() print "test" for i in mygenerator: print(i) test this will be executed only when for ... in ..called only once 0 1 4
可以看出來,當你知道你的函數(shù)會返回數(shù)量非常大的元素供遍歷時,并且只需讀一次的時候,使用yield函數(shù)是非常合適的.
若要掌握yield函數(shù),你必須理解當你調用這個函數(shù)時,函數(shù)內部的代碼實際是沒有執(zhí)行的.這個函數(shù)只是返回一個生成器的對象.當實際遍歷時(for ... in ... ) yield語句才會執(zhí)行.
這里是比較有意思的地方:
第一次使用for訪問這個生產器對象的時候,"print u"this will be executed only when for ... in ..called only once""這句話才被打印出來,并且打印在"test"之后,說明yield之前的函數(shù)體會在for第一次循環(huán)時被調用一次且僅僅調用一次.
但是,如果是這樣情況又不同了:
def createGenerator(): mylist = range(3) print u"this will be executed only when for ... in ..called only once" for i in mylist: print "test3" yield i*i print "test2" mygenerator = createGenerator() print "test" for i in mygenerator: print(i)
結果現(xiàn)在變成了:
test this will be executed only when for ... in ..called only once test3 0 test3 1 test3 4 test2
可見如果在yield語句同級的代碼塊中的語句,其實外層for進行迭代時,每次都會執(zhí)行.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/41432.html
摘要:協(xié)程的基本行為協(xié)程包含四種狀態(tài)等待開始執(zhí)行。協(xié)程中重要的兩個方法調用方把數(shù)據(jù)提供給協(xié)程。注意使用調用協(xié)程時會自動預激,因此與裝飾器不兼容標準庫中的裝飾器不會預激協(xié)程,因此能兼容句法。因此,終止協(xié)程的本質在于向協(xié)程發(fā)送其無法處理的異常。 導語:本文章記錄了本人在學習Python基礎之控制流程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、掌握協(xié)...
摘要:事件循環(huán)是異步編程的底層基石。對事件集合進行輪詢,調用回調函數(shù)等一輪事件循環(huán)結束,循環(huán)往復。協(xié)程直接利用代碼的執(zhí)行位置來表示狀態(tài),而回調則是維護了一堆數(shù)據(jù)結構來處理狀態(tài)。時代的協(xié)程技術主要是,另一個比較小眾。 Coding Crush Python開發(fā)工程師 主要負責豈安科技業(yè)務風險情報系統(tǒng)redq。 引言 1.1. 存儲器山 存儲器山是 Randal Bryant 在《深入...
摘要:于此同時,會阻塞,等待終止。子生成器返回之后,解釋器會拋出異常,并把返回值附加到異常對象上,只是委派生成器恢復。實例運行完畢后,返回的值綁定到上。這一部分處理調用方通過方法傳入的異常。之外的異常會向上冒泡。 上一篇python協(xié)程1:yield的使用介紹了: 生成器作為協(xié)程使用時的行為和狀態(tài) 使用裝飾器預激協(xié)程 調用方如何使用生成器對象的 .throw(...) 和 .close()...
摘要:原文我的微信公眾號每日一練要理解什么是,必須理解什么是生成器。在理解生成器之前,讓我們先了解迭代。直到運行到函數(shù)結尾處停止,此時如果是用則會拋出異常,如果是用則會結束循環(huán)并且不會有異常 原文:https://stackoverflow.com/que...我的微信公眾號:python每日一練 要理解什么是 yield,必須理解什么是生成器(generator)。在理解生成器之前,讓我...
閱讀 1819·2023-04-26 00:30
閱讀 3219·2021-11-25 09:43
閱讀 2955·2021-11-22 14:56
閱讀 3276·2021-11-04 16:15
閱讀 1228·2021-09-07 09:58
閱讀 2089·2019-08-29 13:14
閱讀 3182·2019-08-29 12:55
閱讀 1064·2019-08-29 10:57