通过使用位置对特定的索引进行切片,您可以留在单个loc
世界中并获得所需的索引值。
df.loc[
df['cap'].astype(float) > 35,
df.columns[:-1]
]
通常情况下,在pandas中,您会尽量避免使用链式索引(尽管严格来说,您实际上正在使用两种不同的索引方法)。这种方式不能修改您的数据框架(详情请参见文档),并且文档中还提到性能是另一个原因(与仅进行一次索引相比进行两次索引)。
对于性能问题,通常它是微不足道的(或者说不太可能成为代码瓶颈),而实际上似乎并非如此(至少在以下示例中不是):
df = pd.DataFrame(np.random.uniform(size=(100000,10)),columns = list('abcdefghij'))
# Get columns number 2:5 where value in 'a' is greater than 0.5
# (i.e. Boolean mask along axis 0, position slice of axis 1)
# Deprecated .ix method
%timeit df.ix[df['a'] > 0.5,2:5]
100 loops, best of 3: 2.14 ms per loop
# Boolean, then position
%timeit df.loc[df['a'] > 0.5,].iloc[:,2:5]
100 loops, best of 3: 2.14 ms per loop
# Position, then Boolean
%timeit df.iloc[:,2:5].loc[df['a'] > 0.5,]
1000 loops, best of 3: 1.75 ms per loop
# .loc
%timeit df.loc[df['a'] > 0.5, df.columns[2:5]]
100 loops, best of 3: 2.64 ms per loop
# .iloc
%timeit df.iloc[np.where(df['a'] > 0.5)[0],2:5]
100 loops, best of 3: 9.91 ms per loop
底线:如果你真的想避免使用.ix
,并且不打算修改数据帧中的值,那么就使用链式索引。另一方面(“正确”的但可能更混乱的方式),如果你确实需要修改值,则可以使用.iloc
配合np.where()
或者使用df.index
或df.columns
的整数切片来使用.loc
。
将这个过程分为两步索引怎么样:
df[df['cap'].astype(float) > 35].iloc[:,:-1]
df[df['cap'].astype(float) > 35].drop('cap',1)
.loc
,所以谢谢您。这肯定有效 - 那么总的来说,.ix
被弃用是否迫使需要进行这些类型查询的两步索引? - elPastorloc
,您可以执行df.loc[df['cap'].astype(float) > 35, :"Marketcap"]
,尽管仍无法使用基于位置的索引。 - Psidom