我有一个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”
答案 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
这很干净。