遍歷是眾多編程語(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
如果想要遍歷 DataFrame 的每一行,我們下列函數(shù):
下面對(duì)上述函數(shù)做簡(jiǎn)單的介紹:
以鍵值對(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
該方法按行遍歷,返回一個(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 是列索引。
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沒有受到任何影響。
更多建議: