Pandas 遍歷

2022-11-17 09:24 更新

遍歷是眾多編程語(yǔ)言中必備的一種操作,比如 Python 語(yǔ)言通過(guò) for 循環(huán)來(lái)遍歷列表結(jié)構(gòu)。那么 Pandas 是如何遍歷 Series 和 DataFrame 結(jié)構(gòu)呢?我們應(yīng)該明確,它們的數(shù)據(jù)結(jié)構(gòu)類型不同的,遍歷的方法必然會(huì)存在差異。對(duì)于 Series 而言,您可以把它當(dāng)做一維數(shù)組進(jìn)行遍歷操作;而像 DataFrame 這種二維數(shù)據(jù)表結(jié)構(gòu),則類似于遍歷 Python 字典。

在 Pandas 中同樣也是使用 for 循環(huán)進(jìn)行遍歷。通過(guò)for遍歷后,Series 可直接獲取相應(yīng)的 value,而 DataFrame 則會(huì)獲取列標(biāo)簽。示例如下:

import pandas as pd
import numpy as np
N=20
df = pd.DataFrame({
   'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
   'x': np.linspace(0,stop=N-1,num=N),
   'y': np.random.rand(N),
   'C': np.random.choice(['Low','Medium','High'],N).tolist(),
   'D': np.random.normal(100, 10, size=(N)).tolist()
   })
print(df)
for col in df:
   print (col)

輸出結(jié)果:

            A     x         y       C           D
0  2016-01-01   0.0  0.473795     Low  106.886318
1  2016-01-02   1.0  0.932466  Medium  103.585007
2  2016-01-03   2.0  0.351845     Low  123.155802
3  2016-01-04   3.0  0.788557    High  108.383288
4  2016-01-05   4.0  0.994692  Medium   96.412287
5  2016-01-06   5.0  0.665985    High  102.336044
6  2016-01-07   6.0  0.400009    High  105.284353
7  2016-01-08   7.0  0.435817    High   98.272960
8  2016-01-09   8.0  0.928270  Medium  102.425275
9  2016-01-10   9.0  0.065838    High   90.130532
10 2016-01-11  10.0  0.395355     Low  117.284187
11 2016-01-12  11.0  0.704664    High   93.319759
12 2016-01-13  12.0  0.882175    High  103.833272
13 2016-01-14  13.0  0.784640  Medium   95.257443
14 2016-01-15  14.0  0.399332     Low  108.390020
15 2016-01-16  15.0  0.290280     Low  109.637810
16 2016-01-17  16.0  0.602647  Medium   95.787923
17 2016-01-18  17.0  0.492551     Low   99.256607
18 2016-01-19  18.0  0.759667    High   93.274682
19 2016-01-20  19.0  0.802288    High  107.720403
A
x
y
C
D

內(nèi)置迭代方法

如果想要遍歷 DataFrame 的每一行,我們下列函數(shù):

  • 1) iteritems():以鍵值對(duì) (key,value) 的形式遍歷;
  • 2) iterrows():以 (row_index,row) 的形式遍歷行;
  • 3) itertuples():使用已命名元組的方式對(duì)行遍歷。

下面對(duì)上述函數(shù)做簡(jiǎn)單的介紹:

1) iteritems()

以鍵值對(duì)的形式遍歷 DataFrame 對(duì)象,以列標(biāo)簽為鍵,以對(duì)應(yīng)列的元素為值。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns=['col1','col2','col3'])
for key,value in df.iteritems():
   print (key,value)

輸出結(jié)果:

col1 
0    0.561693
1    0.537196
2    0.882564
3    1.063245
Name: col1, dtype: float64
col2 
0   -0.115913
1   -0.526211
2   -1.232818
3   -0.313741
Name: col2, dtype: float64
col3 
0    0.103138
1   -0.655187
2   -0.101757
3    1.505089
Name: col3, dtype: float64

2) iterrows()

該方法按行遍歷,返回一個(gè)迭代器,以行索引標(biāo)簽為鍵,以每一行數(shù)據(jù)為值。示例如下:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3,3),columns = ['col1','col2','col3'])
print(df)
for row_index,row in df.iterrows():
    print (row_index,row)

輸出結(jié)果:

       col1      col2      col3
0 -0.319301  0.205636  0.247029
1  0.673788  0.874376  1.286151
2  0.853439  0.543066 -1.759512

0
col1   -0.319301
col2    0.205636
col3    0.247029
Name: 0, dtype: float64
1
col1    0.673788
col2    0.874376
col3    1.286151
Name: 1, dtype: float64
2
col1    0.853439
col2    0.543066
col3   -1.759512
Name: 2, dtype: float64

注意:iterrows() 遍歷行,其中 0,1,2 是行索引而 col1,col2,col3 是列索引。

3) itertuples

itertuples() 同樣將返回一個(gè)迭代器,該方法會(huì)把 DataFrame 的每一行生成一個(gè)元組,示例如下:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(3,3),columns = ['c1','c2','c3'])
for row in df.itertuples():
    print(row)

輸出結(jié)果:

Pandas(Index=0, c1=0.253902385555437, c2=0.9846386610838339, c3=0.8814786409138894)
Pandas(Index=1, c1=0.018667367298908943, c2=0.5954745800963542, c3=0.04614488622991075)
Pandas(Index=2, c1=0.3066297875412092, c2=0.17984210928723543, c3=0.8573031941082285)

迭代返回副本

迭代器返回的是原對(duì)象的副本,所以,如果在迭代過(guò)程中修改元素值,不會(huì)影響原對(duì)象,這一點(diǎn)需要大家注意。

看一組簡(jiǎn)單的示例:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3,3),columns = ['col1','col2','col3'])
for index, row in df.iterrows():
   row['a'] = 15
print (df)

輸出結(jié)果:

       col1      col2      col3
0  1.601068 -0.098414 -1.744270
1 -0.432969 -0.233424  0.340330
2 -0.062910  1.413592  0.066311

由上述示例可見,原對(duì)象df沒有受到任何影響。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)