黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Python遍歷pandas數(shù)據(jù)方法總結(jié)

系統(tǒng) 2327 0

前言

Pandas是python的一個(gè)數(shù)據(jù)分析包,提供了大量的快速便捷處理數(shù)據(jù)的函數(shù)和方法。其中Pandas定義了Series 和 DataFrame兩種數(shù)據(jù)類型,這使數(shù)據(jù)操作變得更簡單。Series 是一種一維的數(shù)據(jù)結(jié)構(gòu),類似于將列表數(shù)據(jù)值與索引值相結(jié)合。DataFrame 是一種二維的數(shù)據(jù)結(jié)構(gòu),接近于電子表格或者mysql數(shù)據(jù)庫的形式。

Python遍歷pandas數(shù)據(jù)方法總結(jié)_第1張圖片

在數(shù)據(jù)分析中不可避免的涉及到對(duì)數(shù)據(jù)的遍歷查詢和處理,比如我們需要將dataframe兩列數(shù)據(jù)兩兩相除,并將結(jié)果存儲(chǔ)于一個(gè)新的列表中。本文通過該例程介紹對(duì)pandas數(shù)據(jù)遍歷的幾種方法。

for..in循環(huán)迭代方式

for語句是Python內(nèi)置的迭代器工具,用于從可迭代容器對(duì)象(如列表、元組、字典、集合、文件等)中逐個(gè)讀取元素,直到容器中沒有更多元素為止,工具和對(duì)象之間只要遵循可迭代協(xié)議即可進(jìn)行迭代操作。
具體的迭代的過程:可迭代對(duì)象通過__iter__方法返回迭代器,迭代器具有__next__方法,for循環(huán)不斷地調(diào)用__next__方法,每次按序返回迭代器中的一個(gè)值,直到迭代到最后,沒有更多元素時(shí)拋出異常StopIteration(python自動(dòng)處理異常)。迭代的優(yōu)點(diǎn)是無需把所有元素一次加載到內(nèi)存中,可以在調(diào)用next方法時(shí)逐個(gè)返回元素,避免出現(xiàn)內(nèi)存空間不夠的情況。

            
>>> x = [1,2,3]
>>> its = x.__iter__() #列表是可迭代對(duì)象,否則會(huì)提示不是迭代對(duì)象
>>> its

            
              
>>> next(its) # its包含此方法,說明its是迭代器
1
>>> next(its) 
2
>>>next(its) 
3
>>> next(its) 
Traceback (most recent call last):
 File "
              
                ", line 1, in 
                
                  
StopIteration
                
              
            
          

Python遍歷pandas數(shù)據(jù)方法總結(jié)_第2張圖片

實(shí)現(xiàn)代碼如下:

            
def haversine_looping(df):
disftance_list = []
for i in range(0,len(df)):
 disftance_list.append(df.iloc[i][‘high']/df.iloc[i][‘open'])
 return disftance_list
          

關(guān)于上述代碼中range的實(shí)現(xiàn)方法,我們也可根據(jù)迭代器協(xié)議自實(shí)現(xiàn)相同功能的迭代器(自帶iter方法和next方法)應(yīng)用在for循環(huán)中,代碼如下:

            
class MyRange:
 def __init__(self, num):
  self.i = 0
  self.num = num
 def __iter__(self):
  return self
 def __next__(self):
  if self.i < self.num:
  i = self.i
  self.i += 1
  return i
  else:
  raise StopIteration()
 for i in MyRange(10):
 print(i) 
          

我們也可以通過列表解析的方式用更少的代碼實(shí)現(xiàn)數(shù)據(jù)處理功能

            
disftance_list = [df.iloc[i][‘high']/df.iloc[i][‘open'] for i in range(0,len(df))]
          

iterrows()生成器方式

iterrows是對(duì)dataframe行進(jìn)行迭代的一個(gè)生成器,它返回每行的索引及包含行本身的對(duì)象。所謂生成器其實(shí)是一種特殊的迭代器,內(nèi)部支持了迭代器協(xié)議。Python中提供生成器函數(shù)和生成器表達(dá)式兩種方式實(shí)現(xiàn)生成器,每次請(qǐng)求返回一個(gè)結(jié)果,不需要一次性構(gòu)建一個(gè)結(jié)果列表,節(jié)省了內(nèi)存空間。

生成器函數(shù):編寫為常規(guī)的def語句,但是使用yield語句一次返回一個(gè)結(jié)果,在每個(gè)結(jié)果之間掛起和繼續(xù)它們的狀態(tài)。

            
def gensquares(N):
 for i in range(N):
 yield i**2 
print gensquares(5)
for i in gensquares(5):
 print(i) 


            
              
0
1
4
9
16
            
          

生成器表達(dá)式:類似列表解析,按需產(chǎn)生結(jié)果的一個(gè)對(duì)象。

            
print (x**2 for x in range(5))
print list(x**2 for x in range(5))

            
              
                 at 0xb3d31fa4>
[0, 1, 4, 9, 16]
              
            
          

iterrows()實(shí)現(xiàn)代碼如下:

            
def haversine_looping(df):
disftance_list = []
for index,row in df.iterrows():
 disftance_list.append(row[‘high']/row[‘open'])
 return disftance_list
          

iterrows代碼如下,yield語句掛起該函數(shù)并向調(diào)用者發(fā)送回一組值:

            
def iterrows(self):
 columns = self.columns
 klass = self._constructor_sliced
 for k, v in zip(self.index, self.values):
  s = klass(v, index=columns, name=k)
  yield k, s

          

apply()方法循環(huán)方式

apply()方法可將函數(shù)應(yīng)用于dataframe特定行或列。函數(shù)由lambda方式在代碼中內(nèi)嵌實(shí)現(xiàn),lambda函數(shù)的末尾包含axis參數(shù),用來告知Pandas將函數(shù)運(yùn)用于行(axis = 1)或者列(axis = 0)。

實(shí)現(xiàn)代碼如下:

            
df.apply(lambda row: row[‘high']/row[‘open'], axis =1)
          

Pandas series 的矢量化方式

Pandas的DataFrame、series基礎(chǔ)單元數(shù)據(jù)結(jié)構(gòu)基于鏈表,因此可將函數(shù)在整個(gè)鏈表上進(jìn)行矢量化操作,而不用按順序執(zhí)行每個(gè)值。Pandas包括了非常豐富的矢量化函數(shù)庫,我們可把整個(gè)series(列)作為參數(shù)傳遞,對(duì)整個(gè)鏈表進(jìn)行計(jì)算。

實(shí)現(xiàn)代碼如下:

            
dftest4['rate'] = dftest4['high']/dftest4['open'] 
          

Numpy arrays的矢量化方式

由于函數(shù)的矢量化實(shí)現(xiàn)中只使用了series的數(shù)值,因此可使用values 方法將鏈表從Pandas series轉(zhuǎn)換為NumPy arrays,把NumPy array作為參數(shù)傳遞,對(duì)整個(gè)鏈表進(jìn)行計(jì)算。

實(shí)現(xiàn)代碼如下:

            
dftest5['rate'] = dftest5['high'].values/dftest5['open'].values 
          

總結(jié)

使用timeit方法對(duì)以上幾種遍歷方式進(jìn)行執(zhí)行時(shí)間測(cè)試,測(cè)試結(jié)果如下。可以看出循環(huán)執(zhí)行的速度是最慢的,iterrows()針對(duì)Pandas的dataframe進(jìn)行了優(yōu)化,相比直接循環(huán)有顯著提升。apply()方法也是在行之間進(jìn)行循環(huán),但由于利用了類似Cython的迭代器的一系列全局優(yōu)化,其效率要比iterrows高很多。NumPy arrays的矢量化運(yùn)行速度最快,其次是Pandas series矢量化。由于矢量化是同時(shí)作用于整個(gè)序列的,可以節(jié)省更多的時(shí)間,相比使用標(biāo)量操作更好,NumPy使用預(yù)編譯的C代碼在底層進(jìn)行優(yōu)化,同時(shí)也避免了Pandas series操作過程中的很多開銷,例如索引、數(shù)據(jù)類型等等,因此,NumPy arrays的操作要比Pandas series快得多。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論