[python] pandas iloc vs ix vs loc解释,它们有什么不同?



Answers

iloc基于整数定位工作。 因此,无论您的行标签是什么,您都可以始终如一地完成第一行

df.iloc[0]

或者最后五行

df.iloc[-5:]

你也可以在列上使用它。 这将检索第3列:

df.iloc[:, 2]    # the : in the first position indicates all rows

您可以将它们组合起来以获得行和列的交点:

df.iloc[:3, :3] # The upper-left 3 X 3 entries (assuming df has 3+ rows and columns)

另一方面, .loc使用命名索引。 让我们用字符串设置一个数据框作为行和列标签:

df = pd.DataFrame(index=['a', 'b', 'c'], columns=['time', 'date', 'name'])

然后我们可以得到第一行

df.loc['a']     # equivalent to df.iloc[0]

'date'列的后两行

df.loc['b':, 'date']   # equivalent to df.iloc[1:, 1]

等等。 现在,可能值得指出的是, DataFrame的默认行和列索引是从0 DataFrame的整数,在这种情况下, ilocloc将以相同的方式工作。 这就是为什么你的三个例子是相同的。 如果您有非数字索引(例如字符串或日期时间),则 df.loc[:5] 会引发错误。

此外,您可以通过使用数据框的__getitem__来执行列检索:

df['time']    # equivalent to df.loc[:, 'time']

现在假设你想混合使用位置和命名索引,即使用行上的名称和列上的位置进行索引(为了说明,我的意思是从我们的数据框中选择,而不是在行索引中使用字符串创建数据框,列索引)。 这是.ix进入的地方:

df.ix[:2, 'time']    # the first two rows of the 'time' column

编辑:我认为这也值得一提,你也可以传递布尔向量到loc方法。 例如:

 b = [True, False, True]
 df.loc[b] 

将返回df的第1和第3行。 这相当于用于选择的df[b] ,但它也可以用于通过布尔矢量进行赋值:

df.loc[b, 'name'] = 'Mary', 'John'
Question

有人可以解释这三种切片方法是如何不同的?
我看过这些文档 ,并且看到了these answers ,但我仍然发现自己无法解释三者如何不同。 对我来说,它们似乎可以互换,因为它们处于较低层次的切片。

例如,假设我们想获取DataFrame的前五行。 这三项工作如何?

df.loc[:5]
df.ix[:5]
df.iloc[:5]

有人可以提出三种使用区分更清楚的情况吗?




Links