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会出错,
NotImplementedError
和ValueError
,前者是 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