Выбор строки серии pandas / фрейма данных по целочисленному индексу
мне любопытно, почему df[2]
Не поддерживается, в то время как df.ix[2]
и df[2:3]
оба работают.
In [26]: df.ix[2]
Out[26]:
A 1.027680
B 1.514210
C -1.466963
D -0.162339
Name: 2000-01-03 00:00:00
In [27]: df[2:3]
Out[27]:
A B C D
2000-01-03 1.02768 1.51421 -1.466963 -0.162339
Я бы ожидал df[2]
работать так же, как df[2:3]
чтобы соответствовать соглашению об индексации Python. Есть ли причина дизайна для поддержки индексирования строки одним целым числом?
6 ответов
Эхо @HYRY, см. новые документы в 0.11
http://pandas.pydata.org/pandas-docs/stable/indexing.html
здесь у нас новые операторы,.iloc
to explicity поддерживает только целочисленную индексацию и .loc
для поддержки explicity только индексирование меток
например, представьте себе такой сценарий
In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))
In [2]: df
Out[2]:
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 [5]: df.iloc[[2]]
Out[5]:
A B
4 -0.284561 0.756029
In [6]: df.loc[[2]]
Out[6]:
A B
2 -0.470056 1.192211
[]
нарезает строки (по местоположению метки) только
основная цель оператора индексирования фрейма данных,[]
выбрать столбцы.
когда оператор индексирования передается строка или целое число, он пытается найти столбец с определенным именем и вернуть его в серию.
Итак, в вопросе выше:df[2]
поиск имени столбца, соответствующего целочисленному значению 2
. Этот столбец не существует и KeyError
поднимается.
оператор индексирования DataFrame полностью изменяет поведение для выбора строк при использовании нотации среза
странно, когда задан срез, оператор индексирования фрейма данных выбирает строки и может делать это по целочисленному местоположению или по метке индекса.
df[2:3]
это будет срезать, начиная с строки с целочисленным расположением 2 до 3, исключая последний элемент. Итак, только один ряд. Ниже выбираются строки, начинающиеся с целочисленного расположения 6, но не включающие 20 каждой третьей строки.
df[6:20:3]
вы также можно использовать срезы, состоящие из строковых меток, если в индексе фрейма данных есть строки. Дополнительные сведения см. В разделе это решение .iloc vs .loc.
я почти никогда не использую эту нотацию среза с оператором индексирования, поскольку она не является явной и почти никогда не используется. При нарезке по строкам придерживайтесь .loc/.iloc
.
Вы можете думать, что DataFrame как дикт серии. df[key]
попробуйте выбрать индекс столбца по key
и возвращает объект Series.
однако нарезка внутри [] нарезает строки, потому что это очень распространенная операция.
Вы можете прочитать документ для детали:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
для индексного доступа к таблице pandas также можно рассмотреть numpy.as_array возможность преобразования таблицы в массив Numpy как
np_df = df.as_matrix()
а то
np_df[i]
будет работать.
вы можете цикл через фрейм данных, как это .
for ad in range(1,dataframe_c.size):
print(dataframe_c.values[ad])
вы можете взглянуть на исходный код .
DataFrame
имеет частную функцию _slice()
фрагмент DataFrame
, и это позволяет параметр axis
чтобы определить, какую ось нарезать. The __getitem__()
на DataFrame
не устанавливает ось при вызове _slice()
. Так что _slice()
срежьте его по оси 0 по умолчанию.
вы можете сделать простой эксперимент, который может помочь вам:
print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)