如何在熊猫多行多非连续列中选择(切片)?

时间:2019-05-31 17:13:17

标签: python pandas multiple-columns slice

我有一个dataFrame,我想要一个特定范围的行,同时想要一个由连续范围的列加上一个附加列组成的范围。其中包含一段代码,可产生这种dataFrame

import pandas as pd 
import numpy as np
np.random.seed(5)
dF = pd.DataFrame(np.random.randint(100, size=(100, 6)), 
              columns=list('ABCDEF'), 
              index=['R{}'.format(i) for i in range(100)])
dF.head()

这很好:

dF.loc[:, 'C':'E']

但是我需要这样的东西,这会产生错误:

dF.loc['R95':, ['A':'C', 'F']]

预期结果必须包括行“ R95”及以后的行“ A”,“ C”和“ F”

3 个答案:

答案 0 :(得分:1)

pandas indexing允许以下方式为数据帧建立索引(引用文档):

  
      
  • 单个标签,例如5或'a'(请注意5被解释为索引的标签。此用法不是沿索引的整数位置。)
  •   
  • 标签['a','b','c']的列表或数组。
  •   
  • 带有标签'a':'f'的切片对象(请注意,与通常的python切片相反,当索引中存在切片时,开始和结束都包括在内!请参见使用标签切片。)
  •   
  • 布尔数组
  •   
  • 具有一个参数(调用Series,DataFrame或Panel)的可调用函数,该函数返回用于索引的有效输出(上述之一)。
  •   

所以您需要使用一些更复杂的东西。

例如,您可以使用pandas.concat分别选择列,然后将数据框连接在一起:

pd.concat([dF.loc['R95':, 'A':'C'], dF.loc['R95':,'F']], axis=1)

这给出了:

      A   B   C   F
R95  19   7  76   0
R96  57  31  86  64
R97  51  12  59  33
R98  24   7  68  69
R99  81  20  86  70

答案 1 :(得分:0)

这是一个丑陋的解决方案,但里面仍然有一个冒号

df.loc['R95':, df.loc[:,'A':'C'].columns.tolist()+['F']]

答案 2 :(得分:0)

如果您只能使用索引,则可以执行以下操作:

dF.iloc[95:, np.r_[0:3, -1]]

    A   B   C   F
R95 19  7   76  0
R96 57  31  86  64
R97 51  12  59  33
R98 24  7   68  69
R99 81  20  86  70

这很干净。