Python3——pandas的DataFrame(.ix .loc .iloc)取数据的坑~

版权声明:本文为博主辛苦码出来滴~,才疏学浅,如有不对尽请指正,未经博主允许不得转载。

pandas 是数据处理中最常用的工具之一,有时候我们不需要用整个DataFrame里的数据,而是只想取各别的行或列,这时候可以用.ix .loc .iloc来实现,不过这三种在使用的时候要特别注意以下情况:

  1. 数据的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
  1. 数据的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 适用于用行列下标取值的情况

猜你喜欢

转载自blog.csdn.net/Muzi_Water/article/details/85343042