Pandas 索引和數(shù)據(jù)查詢的操作實例
在本章中,我們將討論如何對日期進行切片和切塊,并獲得Pandas對象的子集。
Python和NumPy索引運算符“[]”和屬性運算符“.”。可以在各種用例中快速輕松地訪問Pandas數(shù)據(jù)結(jié)構(gòu)。但是,由于事先不知道要訪問的數(shù)據(jù)類型,因此直接使用標(biāo)準(zhǔn)運算符存在一些優(yōu)化限制。對于生產(chǎn)代碼,我們建議您利用本章中介紹的優(yōu)化的熊貓數(shù)據(jù)訪問方法。
Pandas現(xiàn)在支持三種類型的多軸索引:下表中提到了三種類型-
索引 | 說明 |
.loc() | 基于標(biāo)簽 |
.iloc() | 基于整數(shù) |
.ix() | 基于標(biāo)簽和整數(shù) |
Pandas 提供了多種方法來具有純粹基于標(biāo)簽的索引。切片時,還包括起始邊界。整數(shù)是有效的標(biāo)簽,但它們引用的是標(biāo)簽而不是位置。
.loc() 具有多種訪問方法,例如:
一個標(biāo)量標(biāo)簽 標(biāo)簽列表 切片對象 布爾數(shù)組
loc 需要兩個單/列表/范圍運算符,以“,”分隔。第一個指示行,第二個指示列。
# 導(dǎo)入pandas庫并起別名pd import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D']) # 選擇特定列的所有行 print(df.loc[:,'A'])
運行結(jié)果:
a 0.391548 b -0.070649 c -0.317212 d -2.162406 e 2.202797 f 0.613709 g 1.050559 h 1.122680 Name: A, dtype: float64
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D']) # 為多個列選擇所有行,比如list[] print(df.loc[:,['A','C']])
運行結(jié)果:
A C a 0.391548 0.745623 b -0.070649 1.620406 c -0.317212 1.448365 d -2.162406 -0.873557 e 2.202797 0.528067 f 0.613709 0.286414 g 1.050559 0.216526 h 1.122680 -1.621420
# 導(dǎo)入pandas庫并起別名pd import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D']) # 為多個列選擇幾行,比如list[] print(df.loc[['a','b','f','h'],['A','C']])
運行結(jié)果:
A C a 0.391548 0.745623 b -0.070649 1.620406 f 0.613709 0.286414 h 1.122680 -1.621420
# 導(dǎo)入pandas庫并起別名pd import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D']) # 為所有列選擇行范圍 print(df.loc['a':'h'])
運行結(jié)果:
A B C D a 0.391548 -0.224297 0.745623 0.054301 b -0.070649 -0.880130 1.620406 1.419743 c -0.317212 -1.929698 1.448365 0.616899 d -2.162406 0.614256 -0.873557 1.093958 e 2.202797 -2.315915 0.528067 0.612482 f 0.613709 -0.157674 0.286414 -0.500517 g 1.050559 -2.272099 0.216526 0.928449 h 1.122680 0.324368 -1.621420 -0.741470
# 導(dǎo)入pandas庫并起別名pd import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D']) # 用于使用布爾數(shù)組獲取值 print(df.loc['a']>0)
運行結(jié)果:
A False B True C False D False Name: a, dtype: bool
Pandas 提供了多種方法來獲得純粹基于整數(shù)的索引。像python和numpy一樣,它們都是基于0的索引。
各種訪問方法如下:
整數(shù) 整數(shù)列表 值范圍
# 導(dǎo)入pandas庫并起別名pd import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D']) # 選擇特定列的所有行 print(df.iloc[:4])
運行結(jié)果:
A B C D 0 0.699435 0.256239 -1.270702 -0.645195 1 -0.685354 0.890791 -0.813012 0.631615 2 -0.783192 -0.531378 0.025070 0.230806 3 0.539042 -1.284314 0.826977 -0.026251
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D']) # 整數(shù)切片 print(df.iloc[:4] print(df.iloc[1:5, 2:4])
運行結(jié)果:
A B C D 0 0.699435 0.256239 -1.270702 -0.645195 1 -0.685354 0.890791 -0.813012 0.631615 2 -0.783192 -0.531378 0.025070 0.230806 3 0.539042 -1.284314 0.826977 -0.026251 C D 1 -0.813012 0.631615 2 0.025070 0.230806 3 0.826977 -0.026251 4 1.423332 1.130568
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D']) # 對值列表進行切片 print(df.iloc[[1, 3, 5], [1, 3]] print(df.iloc[1:3, :]) print(df.iloc[:,1:3])
運行結(jié)果:
B D 1 0.890791 0.631615 3 -1.284314 -0.026251 5 -0.512888 -0.518930 A B C D 1 -0.685354 0.890791 -0.813012 0.631615 2 -0.783192 -0.531378 0.025070 0.230806 B C 0 0.256239 -1.270702 1 0.890791 -0.813012 2 -0.531378 0.025070 3 -1.284314 0.826977 4 -0.460729 1.423332 5 -0.512888 0.581409 6 -1.204853 0.098060 7 -0.947857 0.641358
除了基于純標(biāo)簽和基于整數(shù)的方法外,Pandas還提供了一種混合方法,用于使用.ix()運算符選擇和子集對象。
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D']) # 整數(shù)切片 print(df.ix[:4])
運行結(jié)果:
A B C D 0 0.699435 0.256239 -1.270702 -0.645195 1 -0.685354 0.890791 -0.813012 0.631615 2 -0.783192 -0.531378 0.025070 0.230806 3 0.539042 -1.284314 0.826977 -0.026251
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D']) # 索引切片 print(df.ix[:,'A'])
運行結(jié)果:
0 0.699435 1 -0.685354 2 -0.783192 3 0.539042 4 -1.044209 5 -1.415411 6 1.062095 7 0.994204 Name: A, dtype: float64
通過多軸索引從Pandas對象獲取值使用以下符號:
對象 | 索引器 | 返回類型 |
Series | s.loc[indexer] | 標(biāo)量值 |
DataFrame | df.loc[row_index,col_index] | Series 對象 |
Panel | p.loc[item_index,major_index, minor_index] | p.loc[item_index,major_index, minor_index] |
.iloc()和.ix()應(yīng)用相同的索引選項和返回值。
我們看看如何對DataFrame對象執(zhí)行每個操作。我們將使用基本索引運算符'[]'-
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D']) print(df['A'])
運行結(jié)果:
0 -0.478893 1 0.391931 2 0.336825 3 -1.055102 4 -0.165218 5 -0.328641 6 0.567721 7 -0.759399 Name: A, dtype: float64
我們可以將值列表傳遞給[]以選擇那些列
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D']) print(df[['A','B']])
運行結(jié)果:
A B 0 -0.478893 -0.606311 1 0.391931 -0.949025 2 0.336825 0.093717 3 -1.055102 -0.012944 4 -0.165218 1.550310 5 -0.328641 -0.226363 6 0.567721 -0.312585 7 -0.759399 -0.372696
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D']) print(df[2:2])
運行結(jié)果:
Columns: [A, B, C, D] Index: []
可以使用屬性運算符“?!边x擇列。
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D']) print(df.A)
運行結(jié)果:
0 -0.478893 1 0.391931 2 0.336825 3 -1.055102 4 -0.165218 5 -0.328641 6 0.567721 7 -0.759399 Name: A, dtype: float64