dataframe选取行、列方法总结。ix、iloc、loc等

pandas中的切片方法

[],loc,iloc,at,iat,ix
基础数据

import pandas as pd
import random
random.seed(0)
rnd_1 = [random.randrange(1,20) for x in range(10)]
rnd_2 = [random.randrange(1,20) for x in range(10)]
rnd_3 = [random.randrange(1,20) for x in range(10)]
fecha = pd.date_range('2012-4-10', '2012-4-19')
data = pd.DataFrame({'fecha':fecha, 'rnd_1': rnd_1, 'rnd_2': rnd_2, 'rnd_3': rnd_3})
print(data)
print(data.describe())

    
    
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

结果:

       fecha  rnd_1  rnd_2  rnd_3
0 2012-04-10     13     19     10
1 2012-04-11     14      7      4
2 2012-04-12      2     17      3
3 2012-04-13      9      5     11
4 2012-04-14     17     10     16
5 2012-04-15     16      5     18
6 2012-04-16     13      4      4
7 2012-04-17     10      9     12
8 2012-04-18     16     18     14
9 2012-04-19     12      5     11
           rnd_1      rnd_2      rnd_3
count  10.000000  10.000000  10.000000
mean   12.200000   9.900000  10.300000
std     4.417138   5.915141   5.186521
min     2.000000   4.000000   3.000000
25%    10.500000   5.000000   5.500000
50%    13.000000   8.000000  11.000000
75%    15.500000  15.250000  13.500000
max    17.000000  19.000000  18.000000

    
    
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

[]切片方法

按照索引实现行选择或列选择或区块选择

print(data[1:5])   # 行选择
   fecha  rnd_1  rnd_2  rnd_3

1 2012-04-11 14 7 4
2 2012-04-12 2 17 3
3 2012-04-13 9 5 11
4 2012-04-14 17 10 16

print(data[[‘rnd_1’, ‘rnd_2’]]) # 列选择

rnd_1 rnd_2
0 13 19
1 14 7
2 2 17
3 9 5
4 17 10
5 16 5
6 13 4
7 10 9
8 16 18
9 12 5

区块选择, 对于多列选择,不能像行选择时一样使用1:5这样的方法来选择

print(data[:5][[‘rnd_1’, ‘rnd_2’]])

rnd_1 rnd_2
0 13 19
1 14 7
2 2 17
3 9 5
4 17 10

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

loc

loc可以按照索引来进行行列选择,包含结尾

# 按照索引行选择, loc与第一种方法不同之处在于会把第5行也选择进去,而第一种方法只会选择到第4行为止。
print(data.loc[1:5])
   fecha  rnd_1  rnd_2  rnd_3

1 2012-04-11 14 7 4
2 2012-04-12 2 17 3
3 2012-04-13 9 5 11
4 2012-04-14 17 10 16
5 2012-04-15 16 5 18

区块选择

print(data.loc[2:4, [‘rnd_2’, ‘fecha’]])

rnd_2 fecha
2 17 2012-04-12
3 5 2012-04-13
4 10 2012-04-14

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

loc能够选择在两个特定日期之间的数据,这两个日期必须都要在索引中

# 将行索引设定为日期
data_fecha = data.set_index('fecha')
print(data_fecha.head())
        rnd_1  rnd_2  rnd_3

fecha
2012-04-10 13 19 10
2012-04-11 14 7 4
2012-04-12 2 17 3
2012-04-13 9 5 11
2012-04-14 17 10 16

生成两个特定日期

from pandas import datetime
fecha_1 = datetime(2012, 4, 14)
fecha_2 = datetime(2012, 4, 18)

生成切片数据

print(data_fecha.loc[fecha_1: fecha_2])

        rnd_1  rnd_2  rnd_3

fecha
2012-04-14 17 10 16
2012-04-15 16 5 18
2012-04-16 13 4 4
2012-04-17 10 9 12
2012-04-18 16 18 14

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

如果没有特殊需求,强烈建议使用loc而尽量少使用[],因为loc在对DataFrame进行重新赋值操作时会避免chained indexing问题,使用[]时编译器很可能会给出SettingWithCopy的警告。

iloc

loc是按照索引(index)的值来选取,iloc是按照索引的位置来进行选取。iloc不关心索引的具体值是多少,只关心位置是多少,所以使用iloc时方括号中只能使用数值

# 行选择
print(data_fecha.iloc[1: 5, :])
        rnd_1  rnd_2  rnd_3

fecha
2012-04-11 14 7 4
2012-04-12 2 17 3
2012-04-13 9 5 11
2012-04-14 17 10 16

列选择

print(data_fecha.iloc[:,[1,2]].head())

        rnd_2  rnd_3

fecha
2012-04-10 19 10
2012-04-11 7 4
2012-04-12 17 3
2012-04-13 5 11
2012-04-14 10 16

切片选择

print( data_fecha.iloc[[1,3,6],[0,2]])

        rnd_1  rnd_3

fecha
2012-04-11 14 4
2012-04-13 9 11
2012-04-16 13 4

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

at

at的使用方法与loc类似,但是比loc有更快的访问数据的速度,只能访问单个元素,不能访问多个元素

iat

iat对于iloc的关系就像at对于loc的关系,是一种更快的基于索引位置的选择方法,同at一样只能访问单个元素

ix

以上几种方法都要求查询的秩在索引中,或者位置不超过长度范围,而ix允许你得到不在DataFrame索引中的数据。

选取或者删除某列含有特殊数值的行

import pandas as pd
import numpy as np

a=np.array([[1,2,3],[4,5,6],[7,8,9]])
df1=pd.DataFrame(a,index=[‘row0’,‘row1’,‘row2’],columns=list(‘ABC’))
print(df1)
df2=df1.copy()

#选取某列含有特定数值的行

选取df1中A列包含数字1的行

df1=df1[df1[‘A’].isin([1])]
#通过~取反,选取不包含数字1的行
df2=df2[~df2[‘A’].isin([1])]
print(df1)
print(df2)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

结果:

      A  B  C
row0  1  2  3
row1  4  5  6
row2  7  8  9
  A  B  C

row0 1 2 3

  A  B  C

row1 4 5 6
row2 7 8 9

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

选取或者删除某行含有特殊值的列

import pandas as pd
import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
df2 = pd.DataFrame(a, index=[‘row0’, ‘row1’, ‘row2’], columns=list(‘ABC’))
print(df2)
#选取某行含有特定数值的列
cols=[x for i,x in enumerate(df2.columns) if df2.iat[0,i]==3]
#利用enumerate对row0进行遍历,将含有数字3的列放入cols中
print(cols)

#df2=df2[cols] 选取含有特定数值的列
df2=df2.drop(cols,axis=1) #利用drop方法将含有特定数值的列删除
print(df2)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

结果:

A  B  C
row0  1  2  3
row1  4  5  6
row2  7  8  9
['C']
      A  B
row0  1  2
row1  4  5
row2  7  8

   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
                                

你可能感兴趣的:(pandas)