版權聲明:本文爲博主辛苦碼出來滴~,才疏學淺,如有不對盡請指正,未經博主允許不得轉載。
pandas 是數據處理中最常用的工具之一,有時候我們不需要用整個DataFrame裏的數據,而是隻想取各別的行或列,這時候可以用.ix .loc .iloc來實現,不過這三種在使用的時候要特別注意以下情況:
- 數據的index是默認值,也就是0,1,……
此時用data.ix[0:n, 列名或數字] 或data.loc[0:n, 列名] 取數據時,是可以取到index=n這列的,因爲此時0:n指的不是下標,而是index的名稱。
不過data.iloc[0:n, 數字或data.columns==‘列名’]只能取到前n行,也就是index=n-1的行。
import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(0, 25).reshape(5, 5), columns=list('abcde'))
print('原始數據\n', data)
print('\n.ix 取數據')
print(data.ix[0:3, data.columns != 'b']) # 注意:index名稱 0:3 可以取到名稱3
print('\n.loc 取數據')
print(data.loc[0:3, data.columns != 'b']) # 注意:index名稱 0:3 可以取到名稱3
print('\n.iloc 取數據')
print(data.iloc[0:3, data.columns != 'b']) # 下標 0:3 取不到3
原始數據
a b c d e
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
4 20 21 22 23 24
.ix 取數據
a c d e
0 0 2 3 4
1 5 7 8 9
2 10 12 13 14
3 15 17 18 19
.loc 取數據
a c d e
0 0 2 3 4
1 5 7 8 9
2 10 12 13 14
3 15 17 18 19
.iloc 取數據
a c d e
0 0 2 3 4
1 5 7 8 9
2 10 12 13 14
- 數據的index是指定名稱的值
此時用data.ix[0:n,列名或數字] 取數據時與data.iloc[0:n,數字或data.columns==‘列名’]一樣,是取不到index=n這列的,因爲此時0:n指的是下標,只能取到前n行。
此時data.loc[0:n, 列名]不能這樣用,應該寫對應的index指定的值。
data = pd.DataFrame(np.arange(0, 25).reshape(5, 5), columns=list('abcde'), index=list('ABCDE'))
print('原始數據\n', data)
print('\n.ix 取數據')
print(data.ix[0:3, 1]) # 注意:index下標 0:3 取不到3
print('\n.loc 取數據')
print(data.loc[['A', 'B'], data.columns == 'b']) # 注意:必須用index名稱
print('\n.iloc 取數據')
print(data.iloc[0:3, 1]) # 下標 0:3 取不到3
原始數據
a b c d e
A 0 1 2 3 4
B 5 6 7 8 9
C 10 11 12 13 14
D 15 16 17 18 19
E 20 21 22 23 24
.ix 取數據
b
A 1
B 6
C 11
.loc 取數據
b
A 1
B 6
.iloc 取數據
b
A 1
B 6
C 11
總的來說,哪種方法用的慣就用哪種,就是需要注意.ix 和.loc的坑,以下是我按自己的使用情況做的總結:
方法 | 適用情況 |
---|---|
.ix | 適用於列數較多時,想取的列比較分散的情況;如果有複雜的index值且行數較多時,也適用於想取的行比較分散的情況 |
.loc | 適用於列數較多時,想取的列比較分散的情況; 如果有簡單index值且行數較多時,也適用於想取的行比較分散的情況 |
.iloc | 適用於用行列下標取值的情況 |