欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python遍歷pandas數據方法總結

系統 1976 0

前言

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

Python遍歷pandas數據方法總結_第1張圖片

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

for..in循環迭代方式

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

            
>>> x = [1,2,3]
>>> its = x.__iter__() #列表是可迭代對象,否則會提示不是迭代對象
>>> 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數據方法總結_第2張圖片

實現代碼如下:

            
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
          

關于上述代碼中range的實現方法,我們也可根據迭代器協議自實現相同功能的迭代器(自帶iter方法和next方法)應用在for循環中,代碼如下:

            
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) 
          

我們也可以通過列表解析的方式用更少的代碼實現數據處理功能

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

iterrows()生成器方式

iterrows是對dataframe行進行迭代的一個生成器,它返回每行的索引及包含行本身的對象。所謂生成器其實是一種特殊的迭代器,內部支持了迭代器協議。Python中提供生成器函數和生成器表達式兩種方式實現生成器,每次請求返回一個結果,不需要一次性構建一個結果列表,節省了內存空間。

生成器函數:編寫為常規的def語句,但是使用yield語句一次返回一個結果,在每個結果之間掛起和繼續它們的狀態。

            
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
            
          

生成器表達式:類似列表解析,按需產生結果的一個對象。

            
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()實現代碼如下:

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

iterrows代碼如下,yield語句掛起該函數并向調用者發送回一組值:

            
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()方法循環方式

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

實現代碼如下:

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

Pandas series 的矢量化方式

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

實現代碼如下:

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

Numpy arrays的矢量化方式

由于函數的矢量化實現中只使用了series的數值,因此可使用values 方法將鏈表從Pandas series轉換為NumPy arrays,把NumPy array作為參數傳遞,對整個鏈表進行計算。

實現代碼如下:

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

總結

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 91中文字幕在线 | 亚洲欧美日韩激情在线观看 | 国产精品日韩欧美 | 日本黄页免费大片在线观看 | 亚洲精品一区久久久久久 | 久久久精彩视频 | 色999精品 | 激情六月丁香婷婷 | 天天做天天爱天天爽天天综合 | 色综合免费 | 欧美日韩性高爱潮视频 | 夜夜久久 | 青青草娱乐在线 | 国产精品极品美女在线观看免费 | 亚洲一区二区中文字幕 | 99热最新网址 | www.午夜剧场 | 五月天婷婷久久 | 免费一看一级毛片 | 成人全黄三级视频在线观看 | 热久久这里只有精品 | 国产激情一级毛片久久久 | 亚洲黄色片在线观看 | 精品一区二区三区免费站 | 成人伊人 | 国产精品久久久久久无遮挡 | 草草在线免费视频 | 久久人人爽人人爽 | 久久成年人视频 | 久久精彩免费视频 | 久久久不卡网国产精品一区 | 国产超级乱淫视频播放 | 成人高清在线 | 四虎国产成人免费观看 | 国产精品久久久久影院色老大 | 91精品国产综合久久欧美 | 一区二区三区中文字幕 | 国产福利视频一区美女 | 色婷婷综合缴情综六月 | 国产精品手机在线观看 | 国产精品国产午夜免费福利看 |