版权声明:本文为博主辛苦码出来滴~,才疏学浅,如有不对尽请指正,未经博主允许不得转载。
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 | 适用于用行列下标取值的情况 |