Pandas 索引和选择数据

Pandas 索引和选择数据,Python和NumPy索引运算符"[]"和属性运算符"."可以快速轻松地访问Pandas数据结构。由于要访问的数据类型不是预先知道的,直接使用标准运算符具有一些限制。

Pandas支持三种索引方法:

编号 索引 描述
1 .loc() 基于标签
2 .iloc() 基于整数
3 .ix() 基于标签和整数,在0.20.0中已经不建议使用了

.loc()

.loc()主要基于标签(label)的,包括行标签(index)和列标签(colums),即行名称和列名称,可以使用def.loc[index_name, col_name]选择指定位置的数据,主要用法有:

  • 单个标量标签,如果.loc中只有单个标签,那么选择的是一行。如:df.loc['a']选择的是 index 为’a’的一样。
  • 标签列表,如:df.loc[['a', 'b', 'c']],同样只选择行。
  • 切片对象,与通常的 python 切片不同,在最终选择的数据数据中包含切片的 start 和 stop。如:df.loc['c' : 'h'] 即包含’c’行,也包含’h’行。
  • 布尔数组,用于筛选符合某些条件的行,如:df.loc[df.A>0.5] 筛选出所有’A’列大于0.5的行。

示例1

#import the pandas library and aliasing as pd
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'])

#select all rows for a specific column
print (df.loc[:,'A'])

执行上面示例代码,得到以下结果:

a   -1.080720
b    1.397701
c   -0.823286
d    0.064870
e   -0.195917
f    1.500541
g    1.512237
h   -0.301736
Name: A, dtype: float64

示例2

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'])

# Select all rows for multiple columns, say list[]
print (df.loc[:,['A','C']])

执行上面示例代码,得到以下结果:

          A         C
a  0.773253  0.133169
b -0.152366 -0.466798
c -0.659507 -0.492561
d  1.652522  0.762202
e -0.228704 -1.016816
f -1.111037  0.705170
g  0.675199 -0.611795
h -1.708064 -0.864365

示例3

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'])

# Select few rows for multiple columns, say list[]
print (df.loc[['a','b','f','h'],['A','C']])
# Select all rows for multiple columns, say list[]
print (df.loc[:,['A','C']])

执行上面示例代码,得到以下结果:

          A         C
a -0.656688 -0.470242
b  0.385045 -0.823597
f  0.249693 -0.847722
h  1.101570  0.184854
          A         C
a -0.656688 -0.470242
b  0.385045 -0.823597
c  1.232854 -0.520071
d  0.789200  2.781254
e  1.459123  0.263282
f  0.249693 -0.847722
g  0.311193 -0.266539
h  1.101570  0.184854

示例4

# import the pandas library and aliasing as pd
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'])

# Select range of rows for all columns
print (df.loc['a':'h'])

执行上面示例代码,得到以下结果:

          A         B         C         D
a -1.766033 -1.418973 -0.081768 -0.075240
b -0.482872 -2.128755  0.110222 -2.245817
c  1.354420  1.176566 -1.544004  1.850402
d  0.015856 -1.487891  0.046055 -1.612705
e  0.798164 -0.453711  0.646399  0.421087
f -2.252995  0.720619  1.514084  0.642931
g  0.612089 -0.016758  0.699446 -2.090793
h  1.107763  0.080075  0.328614  0.965151

示例5

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'])

# for getting values with a boolean array
print (df.loc['a']>0)

执行上面示例代码,得到以下结果:

A    False
B    False
C    False
D    False
Name: a, dtype: bool

.iloc()

.iloc() 是基于整数的索引,利用元素在各个轴上的索引序号进行选择,序号超过范围产生IndexError,切片时允许序号超过范围。

各种访问方式如下 –

  • 整数,与.loc相同,如果只使用一个维度,则对行选择,小标从 0 开始。如:df.iloc[5],选择第 6 行。
  • 整数列表或者数组,如df.iloc[[5, 1, 7]],选择第 6 行, 第 2 行, 第 8 行。
  • 元素为整数的切片操作,与.loc不同,这里下标为 stop 的数据不被选择。如:df.iloc[0:3], 只包含 0,1,2行,不包含第 3 行。
  • 使用布尔数组进行筛选,如 df.iloc[np.array(df.A>0.5)]df.iloc[list(df.A>0.5)]

注意使用布尔数组进行筛选时,可以使用 list 或者 array,使用 Series会出错,NotImplementedErrorValueError,前者是 Series 的 index 与待切片 DataFrame的index 不同时报错,后置 index 相同时报错。
.loc使用布尔数组,可以使用 list, array, 也可以使用Series,使用Series时 index需要一致,否则会报 IndexError

示例1

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# select all rows for a specific column
print (df.iloc[:4])

执行上面示例代码,得到以下结果 –

          A         B         C         D
0 -0.115892  2.396043 -1.197159  0.853264
1  1.356529  0.147086 -0.176918  0.369814
2  0.272383 -1.092620 -0.179162  0.927654
3  0.244275  2.065297  0.515167 -1.148936

示例2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# Integer slicing
print (df.iloc[:4])
print (df.iloc[1:5, 2:4])

执行上面示例代码,得到以下结果 –

          A         B         C         D
0 -0.334957  0.003567 -0.383992  0.869259
1  0.208281  1.233185  0.057816  0.205882
2  1.673836  1.136786 -1.053916 -0.010279
3  0.945121 -1.193217 -1.833249 -0.423386
          C         D
1  0.057816  0.205882
2 -1.053916 -0.010279
3 -1.833249 -0.423386
4 -0.323664  1.422467

示例3

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# Slicing through list of values
print (df.iloc[[1, 3, 5], [1, 3]])
print (df.iloc[1:3, :])
print (df.iloc[:,1:3])

执行上面示例代码,得到以下结果 –

          B         D
1 -1.131395 -0.301301
3  0.145678 -1.305442
5 -0.951487  1.082995
          A         B         C         D
1  0.097625 -1.131395 -1.024437 -0.301301
2 -0.161353  0.597387 -0.106473 -0.395230
          B         C
0  1.019034 -0.074128
1 -1.131395 -1.024437
2  0.597387 -0.106473
3  0.145678  1.461689
4  0.838873 -0.845175
5 -0.951487  1.509413
6 -0.518707  0.219204
7 -0.948292 -0.919370

.ix()

除了基于纯标签和整数之外,Pandas还提供了一种使用.ix()运算符进行选择和子集化对象的混合方法。在0.20.0中已经不建议使用了,本章只做简单介绍。
示例1

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

# Integer slicing
print (df.ix[:4])

执行上面示例代码,得到以下结果 –

          A         B         C         D
0  0.101732  0.385476 -0.716069 -1.462599
1 -0.049541  0.287190  0.178786 -0.101089
2  1.346964  0.035192 -0.358857  0.932185
3 -0.057835 -0.765513  0.052227  0.611692
4  0.191660 -1.134119 -1.155529 -0.427058

示例2

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Index slicing
print (df.ix[:,'A'])

执行上面示例代码,得到以下结果 –

0   -0.510629
1   -0.555033
2    1.469633
3   -2.146120
4   -0.105645
5    1.096806
6   -1.208564
7    0.837835
Name: A, dtype: float64

切片操作

[]操作只能输入一个维度,不能用逗号隔开输入两个维度。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print(df['a', 'A'])

执行上面示例代码,得到以下结果 –

Traceback (most recent call last):
  File "C:\Python\Python35\lib\site-packages\pandas\core\indexes\base.py", line 3063, in get_loc
    return self._engine.get_loc(key)
  File "pandas\_libs\index.pyx", line 140, in pandas._libs.index.IndexEngine.get_loc
  File "pandas\_libs\index.pyx", line 162, in pandas._libs.index.IndexEngine.get_loc
  File "pandas\_libs\hashtable_class_helper.pxi", line 1492, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas\_libs\hashtable_class_helper.pxi", line 1500, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: ('a', 'A')

.loc.iloc只输入一维时选择的行,而[]选择的是列,并且必须使用列名。

示例1

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print (df['A'])

执行上面示例代码,得到以下结果 –

0   -0.634695
1   -1.552806
2   -0.248311
3   -0.959873
4    0.399436
5    0.129919
6    0.509267
7   -2.452444
Name: A, dtype: float64

示例2

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])

print (df[['A','B']])

执行上面示例代码,得到以下结果 –

          A         B
0 -0.406406 -0.018110
1  0.616192  0.512940
2 -0.345786  1.040719
3  1.587768 -0.105433
4  0.795869  0.349248
5  0.933675  1.010315
6 -0.852394 -0.673538
7  0.287406 -1.499501

示例3

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print (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'])

print (df.A)

执行上面示例代码,得到以下结果 –

0   -0.406159
1   -1.115516
2    0.401536
3   -0.690638
4    0.209229
5   -0.241959
6    0.031407
7   -1.941796
Name: A, dtype: float64

学习笔记

loc.iloc支持可调用函数
示例1

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print (df.loc[lambda df:[0,1]]) #选择前两行

执行上面示例代码,得到以下结果 –

          A         B         C         D
0 -0.934925  1.115558 -0.089472 -0.626605
1  0.912093 -0.836559  0.419699 -0.653171

示例2

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print (df.iloc[lambda df:[0,1]]) #选择前两行

执行上面示例代码,得到以下结果 –

          A         B         C         D
0  1.621408 -1.488820  0.662375  0.482247
1  0.869924 -0.849727  1.958840  1.986807

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程