I am curious as to why
df is not supported, while
df[2:3] both work.
In : df.ix Out: A 1.027680 B 1.514210 C -1.466963 D -0.162339 Name: 2000-01-03 00:00:00 In : df[2:3] Out: A B C D 2000-01-03 1.02768 1.51421 -1.466963 -0.162339
I would expect
df to work the same way as
df[2:3] to be consistent with Python indexing convention. Is there a design reason for not supporting indexing row by single integer?
echoing @HYRY, see the new docs in 0.11
Here we have new operators,
.iloc to explicity support only integer indexing, and
.loc to explicity support only label indexing
e.g. imagine this scenario
In : df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB')) In : df Out: A B 0 1.068932 -0.794307 2 -0.470056 1.192211 4 -0.284561 0.756029 6 1.037563 -0.267820 8 -0.538478 -0.800654 In : df.iloc[] Out: A B 4 -0.284561 0.756029 In : df.loc[] Out: A B 2 -0.470056 1.192211
 slices the rows (by label location) only
is to select columns.
When the indexing operator is passed a string or integer, it attempts to find a column with that particular name and return it as a Series.
So, in the question above:
df searches for a column name matching the integer value
2. This column does not exist and a
KeyError is raised.
Strangely, when given a slice, the DataFrame indexing operator selects rows and can do so by integer location or by index label.
This will slice beginning from the row with integer location 2 up to 3, exclusive of the last element. So, just a single row. The following selects rows beginning at integer location 6 up to but not including 20 by every third row.
You can also use slices consisting of string labels if your DataFrame index has strings in it. For more details, see this solution on .iloc vs .loc.
I almost never use this slice notation with the indexing operator as its not explicit and hardly ever used. When slicing by rows, stick with