赞
踩
import pandas as pd
import numpy as np
se1=pd.Series(np.random.randn(4),index=[list("aabb"),[1,2,1,2]])
print(se1)
a 1 -0.172952
2 1.032693
b 1 0.760707
2 -0.281595
dtype: float64
print(se1['a'])
print('\r\n')
print(se1['a':'b'])
1 -0.172952
2 1.032693
dtype: float64
a 1 -0.172952
2 1.032693
b 1 0.760707
2 -0.281595
dtype: float64
print(se1[:,1])
print('\r\n')
print(se1['a',1])
a -0.172952
b 0.760707
dtype: float64
-0.1729515873577343
df1=pd.DataFrame(np.arange(18).reshape(6,3),index=[list("AAABBB"),[1,2,3,1,2,3]],columns=[list("XXY"),[10,11,10]])
print(df1)
X Y
10 11 10
A 1 0 1 2
2 3 4 5
3 6 7 8
B 1 9 10 11
2 12 13 14
3 15 16 17
.loc[]
和.iloc[]
进行引用,实际上是每一层.loc[]
都将原DataFrame“剥”成了较小的子集,在此基础上再次用.loc[]
进行引用.loc[]
和.iloc[]
的排列顺序对应多重索引的级别从高到低,每一级方括号[]
内都是[行,列]
的形式
#根据索引名引用 print('df1.loc[\'A\',:]=') print(df1.loc['A',:]) print('='*50) print('df1.loc[\'A\']=') print(df1.loc['A']) print('='*50) print('df1.loc[:,\'X\']=') print(df1.loc[:,'X']) print('='*50) print('df1.loc[:,\'X\'].loc[10]=') print(df1.loc[:,'X'].loc[:,10]) print('='*50) print('df1.loc[\'A\',\'X\']=') print(df1.loc['A','X']) print('='*50) print('df1.loc[\'A\',\'X\'].loc[1,10]=') print(df1.loc['A','X'].loc[1,10]) print('='*50) #根据行数或列数引用 print('df1.iloc[3,:]=') print(df1.iloc[3,:])
df1.loc['A',:]= X Y 10 11 10 1 0 1 2 2 3 4 5 3 6 7 8 ================================================== df1.loc['A']= X Y 10 11 10 1 0 1 2 2 3 4 5 3 6 7 8 ================================================== df1.loc[:,'X']= 10 11 A 1 0 1 2 3 4 3 6 7 B 1 9 10 2 12 13 3 15 16 ================================================== df1.loc[:,'X'].loc[10]= A 1 0 2 3 3 6 B 1 9 2 12 3 15 Name: 10, dtype: int32 ================================================== df1.loc['A','X']= 10 11 1 0 1 2 3 4 3 6 7 ================================================== df1.loc['A','X'].loc[1,10]= 0 ================================================== df1.iloc[3,:]= X 10 9 11 10 Y 10 11 Name: (B, 1), dtype: int32
:
1:3
这种形式在Python中单独写出来是没有意义的,运行就会直接报错,与Matlab不同。Matlab中的1:3
实际上是调用了linspace
函数,会获得一个实在的数组输出[1,2,3]
。
pandas.IndexSlice
函数。pandas.IndexSlice
的说明跟在本文最后,用来解决一个实际需求。print('df1=\r\n')
print(df1)
print('='*50)
i=1
print('df1.loc[(\'A\',1)]=')
print(df1.loc[('A',i)])
#使用元组进行索引,可以一次性指定行或列的每一级索引
#元组中每一级的索引名可以是变量,但不能是冒号:
df1= X Y 10 11 10 A 1 0 1 2 2 3 4 5 3 6 7 8 B 1 9 10 11 2 12 13 14 3 15 16 17 ================================================== df1.loc[('A',1)]= X 10 0 11 1 Y 10 2 Name: (A, 1), dtype: int32
[('A',1),('B',2)]
这个列表,整句里有两层方括号
.loc[]
所需的两个输入来说,一个列表只能当作一个输入,所以记得在另一个位置加:
或指定索引名print('df1.loc[[(\'A\',1),(\'B\',2)]]=')
print(df1.loc[[('A',1),('B',2)]])
print('='*50)
print('df1.loc[[(\'A\',1),(\'B\',2)],\'X\']=')
print(df1.loc[[('A',1),('B',2)],'X'])
print('='*50)
print(df1.loc[('A',1):('B',2)])
df1.loc[[('A',1),('B',2)]]= X Y 10 11 10 A 1 0 1 2 B 2 12 13 14 ================================================== df1.loc[[('A',1),('B',2)],'X']= 10 11 A 1 0 1 B 2 12 13 ================================================== X Y 10 11 10 A 1 0 1 2 2 3 4 5 3 6 7 8 B 1 9 10 11 2 12 13 14
.loc[]
所需的两个输入来说,一个元组只能当作一个输入,所以记得在另一个位置加:
或指定索引名print(df1.loc[(['A','B'],[1,3]),:])
X Y
10 11 10
A 1 0 1 2
3 6 7 8
B 1 9 10 11
3 15 16 17
.loc[行,列]
格式引用,但每个索引位置都可以是指定了每一级索引名的元组print('df1.loc[(\'A\',1),(\'X\',10)]=')
print(df1.loc[('A',1),('X',10)])
df1.loc[('A',1),('X',10)]=
0
df1.index.levels[0]
获得),第二级行索引位置放入想要筛选出的索引名,列索引类似,第一级列索引的level list通过df1.columns.levels[0]
获得print(df1.loc[(df1.index.levels[0],[1,3]),(df1.columns.levels[0],[10])])
X Y
10 10
A 1 0 2
3 6 8
B 1 9 11
3 15 17
pandas.IndexSlice
函数实现类似Matlab的语法,克服元组中不能写冒号:
的问题
idx = pd.IndexSlice
#pd.IndexSlice生成一个object,用来实现更好的多重索引切片
print(df1.loc[idx[:,[1,3]],idx[:,10]])
X Y
10 10
A 1 0 2
3 6 8
B 1 9 11
3 15 17
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。