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



我有一个数据帧,我想要一个特定行的范围,同时一个由连续的列范围和一个额外的列组成的范围。 包括一段生成此类数据帧的代码

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"列

如果你能只使用索引,你可以做到:

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

这要干净得多。

pandas 索引允许以下方法为数据帧编制索引(引用自文档(:

    单个标签,
  • 例如 5 或 'a'(请注意,5 被解释为索引的标签。此用法不是沿索引的整数位置。
  • 标签列表或数组 ['a', 'b', 'c']。
  • 带有标签"a":'f' 的切片对象(请注意,与通常的 python 切片相反,当索引中存在时,开始和停止都包括在内!请参阅使用标签进行切片。
  • 布尔数组
  • 具有一个参数(调用系列、数据帧或面板(的可调用函数,并返回索引的有效输出(上述值之一(。

所以你需要使用更复杂的东西。

例如,您可以使用 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

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

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

最新更新