布尔索引:
常说的根据某行某列的元素判断是否保留该列或行,
- 布尔符号:’&’,’|’,’~’:分别代表和and,或or,取反not
df[(df['Gender']=='F')&(df['Address']=='street_2')]
df[(df['Math']>85)|(df['Address']=='street_7')]
df[~((df['Math']>75)|(df['Address']=='street_1'))]
#loc和[]中相应位置都能使用布尔列表选择:
df.loc[df['Math']>60,df.columns=='Physics']
- isin方法
df[df['Address'].isin(['street_1','street_4'])&df['Physics'].isin(['A','A+'])]
#上面也可以用字典方式写:
df[df[['Address','Physics']].isin({'Address':['street_1','street_4'],'Physics':['A','A+']}).all(1)]
#all与&的思路是类似的,其中的1代表按照跨列方向判断是否全为True
- 选取一个元素
display(df.at[1101,'School'])
display(df.loc[1101,'School'])
display(df.iat[0,0])
display(df.iloc[0,0])
- 区间索引
利用interval_range方法产生区间
pd.interval_range(start=0,end=5)
#closed参数可选'left''right''both''neither',默认左开右闭
pd.interval_range(start=0,periods=8,freq=5)
#periods参数控制区间个数,freq控制步长
利用cut将数值列转为区间为元素的分类变量
math_interval = pd.cut(df['Math'],bins=[0,40,60,80,100])
#注意,如果没有类型转换,此时并不是区间类型,而是category类型
math_interval.head()
- 区间索引的选取
df_i = df.join(math_interval,rsuffix='_interval')[['Math','Math_interval']]\
.reset_index().set_index('Math_interval')
df_i.head()
#先生成一个索引值为区间的df
df_i.loc[65]
#包含该值就会被选中
df_i.loc[[65,90]]
#包含其中一个就会被选中
如果想要选取某个区间,先要把分类变量转为区间变量,再使用overlap方法
#df_i.loc[pd.Interval(70,75)]报错
df_i[df_i.index.astype('interval').overlaps(pd.Interval(70, 85))]
#Interval.overlaps()检查两个区间有无重叠,返回布尔值
#pd.Interval构造区间,默认左闭右开