介绍

pandas主要有2种数据选择选择格式:基于label的.loc与基于位置的.iloc

.loc主要基于label,当所选择的数据查找不到时,.loc将抛出KeyError。.loc在选择时,格式为loc[行,列],行标签在前,列标签在后。

.loc支持4种方式选择数据:

  1. 单一的标签,比如'a'或'5';注意此处的'5'是索引中的数字标签,而不是位置;
  2. 标签数组['a','b','c'];
  3. 切片:'a':'f'。注意此处逻辑与python切片有差异,它会将开始的a与结束的f都包含进去
  4. boolean数组;

.iloc是基于位置进行查找(从0到length-1),当所选择的数据查找不到时,.iloc将抛出IndexErrro。.iloc在选择时,格式为iloc[行,列],行位置在前,列位置在后。

.iloc支持四种方式选择数据:

  1. 单一的位置数字,比如5;
  2. 数字数组:[1,3,5]
  3. 切片:比如1:7。注意此处逻辑与python切片有差异,它会将开始的a与结束的f都包含进去
  4. boolean数组

注意事项:

对比以下两种取值方法:

1.df['B']['C']
2.df_g.loc[:,['B','C']]

方法一会导致返回的数据是一份copy,你对它进行操作,比如赋值:df['B']['C']=0,可能不会对dataframe造成影响,并会提示:SettingWithCopyWarning。所以推荐使用方法二进行取值。

具体的官方文档解释,见此处

示例

以下示例均在ipython中操作:

df= DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                      'foo', 'bar', 'foo', 'foo'],
                'B' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
                 'C' : np.random.randn(8), 'D' : np.random.randn(8)})
df

输出:

A B C D
0 foo one 0.149304 0.242362
1 bar one 0.665781 0.382197
2 foo two 0.266864 -0.846936
3 bar three -1.456214 0.600248
4 foo two -1.137853 -1.007400
5 bar two 2.312738 -0.528008
6 foo one -1.069947 0.420484
7 foo three 0.786922 -0.956687

输入:

df.loc[3]

输出:

A          bar
B        three
C    -1.456214
D    0.6002484
Name: 3, dtype: object

输入:

df.loc[0:2,('A','B')]

输出

A B
0 foo one
1 bar one
2 foo two

输入:

df.iloc[:1,3:]

输出:

D
0 0.242362

输入:

df.iloc[2]>0.5

输出:

A     True
B     True
C    False
D    False
Name: 2, dtype: bool

输入:

#使用boolean数组,将结果为True的label返回。
df.loc[1:3,df.iloc[2]>0.5]

输出

A B
1 bar one
2 foo two
3 bar three