通常,您希望避免在 pandas 中使用链式索引(但严格来说,您实际上使用了两种不同的索引方法)。您不能以这种方式修改您的数据框(docs 中的详细信息),并且文档将性能作为另一个原因(索引一次与两次)。
对于后者,它通常是微不足道的(或者更确切地说,不太可能成为代码中的瓶颈),实际上似乎并非如此(至少在以下示例中):
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,并且您不打算修改数据框中的值,只需使用链式索引即可。另一方面(“正确”但可以说是更混乱的方式),如果您确实需要修改值,请使用np.where() 或.loc 使用df.index 或df.columns 的整数切片执行.iloc。