我有一个数据帧,我想要一个特定行的范围,同时一个由连续的列范围和一个额外的列组成的范围。 包括一段生成此类数据帧的代码
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']]