學習彙總:點這裏
索引
Python和NumPy索引運算符"[]“和屬性運算符”."。 可以在廣泛的用例中快速輕鬆地訪問Pandas數據結構。然而,由於要訪問的數據類型不是預先知道的,所以直接使用標準運算符具有一些優化限制。
Pandas現在支持三種類型的多軸索引; 這三種類型在下表中提到:
編號 | 索引 | 描述 |
---|---|---|
1 | .loc() | 基於標籤 |
2 | .iloc() | 基於整數 |
3 | .ix() | 基於標籤和整數 |
1.loc()
Pandas提供了各種方法來完成基於標籤的索引。 切片時,也包括起始邊界。整數是有效的標籤,但它們是指標籤而不是位置。.loc()具有多種訪問方式,如 :
- 單個標量標籤
- 標籤列表
- 切片對象
- 一個布爾數組
loc需要兩個單/列表/範圍運算符,用","分隔。第一個表示行,第二個表示列。
>>>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'])
>>>df.loc[:,'A']
a 0.015860
b -0.014135
c 0.446061
d 1.801269
e -1.404779
f -0.044016
g 0.996651
h 0.764672
Name: A, dtype: float64
>>>df.loc[:,['A','C']]
A C
a -0.529735 -1.067299
b -2.230089 -1.798575
c 0.685852 0.333387
d 1.061853 0.131853
e 0.990459 0.189966
f 0.057314 -0.370055
g 0.453960 -0.624419
h 0.666668 -0.433971
>>>df.loc[['a','b','f','h'],['A','C']]
A C
a -1.959731 0.720956
b 1.318976 0.199987
f -1.117735 -0.181116
h -0.147029 0.027369
>>>df = pd.DataFrame(np.random.randn(8, 4),
>>>index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
>>>df.loc['a':'h']
A B C D
a 1.556186 1.765712 1.060657 0.810279
b 1.377965 -0.183283 -0.224379 0.963105
c -0.530016 0.167183 -0.066459 0.074198
d -1.515189 -1.453529 -1.559400 1.072148
e -0.487399 0.436143 -1.045622 -0.029507
f 0.552548 0.410745 0.570222 -0.628133
g 0.865293 -0.638388 0.388827 -0.469282
h -0.690596 1.765139 -0.492070 -0.176074
>>>df.loc['a']>0
A False
B True
C False
D True
Name: a, dtype: bool
2.iloc()
Pandas提供了各種方法,以獲得純整數索引。像python和numpy一樣,第一個位置是基於0的索引。
各種訪問方式如下 -
- 整數
- 整數列表
- 系列值
>>>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'])
>>>df.iloc[[1, 3, 5], [1, 3]]
B D
1 0.081257 0.009109
3 1.037680 -1.467327
5 1.106721 0.320468
>>>df.iloc[1:3, :]
A B C D
1 -0.133711 0.081257 -0.031869 0.009109
2 0.895576 -0.513450 -0.048573 0.698965
>>>df.iloc[:,1:3]
B C
0 0.442735 -0.949859
1 0.081257 -0.031869
2 -0.513450 -0.048573
3 1.037680 -0.801157
4 -0.547456 -0.255016
5 1.106721 0.688142
6 -0.466452 0.219914
7 1.583112 0.982030
3.ix()
除了基於純標籤和整數之外,Pandas還提供了一種使用.ix()運算符進行選擇和子集化對象的混合方法。
>>>import pandas as pd
>>>import numpy as np
>>>df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
>>>df.ix[:4]
A B C D
0 -1.449975 -0.002573 1.349962 0.539765
1 -1.249462 -0.800467 0.483950 0.187853
2 1.361273 -1.893519 0.307613 -0.119003
3 -0.103433 -1.058175 -0.587307 -0.114262
4 -0.612298 0.873136 -0.607457 1.047772
>>>df.ix[:,'A']
0 -1.449975
1 -1.249462
2 1.361273
3 -0.103433
4 -0.612298
5 0.341554
6 -0.075717
7 -0.606742
Name: A, dtype: float64
重建索引
重新索引會更改DataFrame的行標籤和列標籤。重新索引意味着符合數據以匹配特定軸上的一組給定的標籤。可以通過索引來實現多個操作 :
- 重新排序現有數據以匹配一組新的標籤。
- 在沒有標籤數據的標籤位置插入缺失值(NA)標記。
>>>import pandas as pd
>>>import numpy as np
>>>iN=20
>>>idf = 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()
})
#reindex the DataFrame
>>>idf_reindexed = df.reindex(index=[0,2,5], columns=['A', 'C', 'B'])
>>>idf_reindexed
A C B
0 2016-01-01 Low NaN
2 2016-01-03 High NaN
5 2016-01-06 Low NaN
1.重建索引與其他對象對齊
有時可能希望採取一個對象和重新索引,其軸被標記爲與另一個對象相同。
>>>import pandas as pd
>>>import numpy as np
>>>df1 = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])
>>>df2 = pd.DataFrame(np.random.randn(7,3),columns=['col1','col2','col3'])
>>>df1 = df1.reindex_like(df2)
>>>df1
col1 col2 col3
0 -2.467652 -1.211687 -0.391761
1 -0.287396 0.522350 0.562512
2 -0.255409 -0.483250 1.866258
3 -1.150467 -0.646493 -0.222462
4 0.152768 -2.056643 1.877233
5 -1.155997 1.528719 -1.343719
6 -1.015606 -1.245936 -0.295275
注意 : 在這裏,df1數據幀(DataFrame)被更改並重新編號,如df2。 列名稱應該匹配,否則將爲整個列標籤添加NAN。
2.填充時重新加註
reindex()採用可選參數方法,它是一個填充方法,其值如下:
- pad/ffill - 向前填充值
- bfill/backfill - 向後填充值
- nearest - 從最近的索引值填充
>>>import pandas as pd
>>>import numpy as np
>>>df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
>>>df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
>>>df2.reindex_like(df1)
col1 col2 col3
0 1.311620 -0.707176 0.599863
1 -0.423455 -0.700265 1.133371
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
>>>df2.reindex_like(df1,method='ffill')
col1 col2 col3
0 1.311620 -0.707176 0.599863
1 -0.423455 -0.700265 1.133371
2 -0.423455 -0.700265 1.133371
3 -0.423455 -0.700265 1.133371
4 -0.423455 -0.700265 1.133371
5 -0.423455 -0.700265 1.133371
3.重建索引時的填充限制
限制參數在重建索引時提供對填充的額外控制。限制指定連續匹配的最大計數。
>>>import pandas as pd
>>>import numpy as np
>>>df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
>>>df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
>>>df2.reindex_like(df1)
col1 col2 col3
0 0.247784 2.128727 0.702576
1 -0.055713 -0.021732 -0.174577
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
>>>df2.reindex_like(df1,method='ffill',limit=1)
col1 col2 col3
0 0.247784 2.128727 0.702576
1 -0.055713 -0.021732 -0.174577
2 -0.055713 -0.021732 -0.174577
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
4.重命名
rename()方法允許基於一些映射(字典或者系列)或任意函數來重新標記一個軸。
>>>import pandas as pd
>>>import numpy as np
>>>df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
>>>df1
col1 col2 col3
0 0.486791 0.105759 1.540122
1 -0.990237 1.007885 -0.217896
2 -0.483855 -1.645027 -1.194113
3 -0.122316 0.566277 -0.366028
4 -0.231524 -0.721172 -0.112007
5 0.438810 0.000225 0.435479
>>>df1.rename(columns={'col1' : 'c1', 'col2' : 'c2'},index = {0 : 'apple', 1 : 'banana', 2 : 'durian'})
c1 c2 col3
apple 0.486791 0.105759 1.540122
banana -0.990237 1.007885 -0.217896
durian -0.483855 -1.645027 -1.194113
3 -0.122316 0.566277 -0.366028
4 -0.231524 -0.721172 -0.112007
5 0.438810 0.000225 0.435479
選擇數據
使用符號
使用多軸索引從Pandas對象獲取值可使用以下符號 :
對象 | 索引 | 描述 |
---|---|---|
Series | s.loc[indexer] | 標量值 |
DataFrame | df.loc[row_index,col_index] | 標量對象 |
Panel | p.loc[item_index,major_index, minor_index] | p.loc[item_index,major_index, minor_index] |
注意 - .iloc()和.ix()應用相同的索引選項和返回值。
>>>import pandas as pd
>>>import numpy as np
>>>df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
>>>df[['A','B']]
A B
0 -0.767339 -0.729411
1 -0.563540 -0.639142
2 0.873589 -2.166382
3 0.900330 0.253875
4 -0.520105 0.064438
5 -1.452176 -0.440864
6 -0.291556 -0.861924
7 -1.464235 0.313168
>>>df[2:2]
Empty DataFrame
Columns: [A, B, C, D]
Index: []
屬性訪問
可以使用屬性運算符.來選擇列。
>>>import pandas as pd
>>>import numpy as np
>>>df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
>>>df.A
0 0.104820
1 -1.206600
2 0.469083
3 -0.821226
4 -1.238865
5 1.083185
6 -0.827833
7 -0.199558
Name: A, dtype: float64