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. Есть ли причина дизайна для не поддерживать индексирование строки одним целым?
Ответы
Ответ 1
echoing @HYRY, см. новые документы в 0.11
http://pandas.pydata.org/pandas-docs/stable/indexing.html
Здесь у нас есть новые операторы, .iloc
для пояснения поддерживают только целочисленную индексацию, а .loc
для объяснения поддерживают только индексирование меток
например. представить этот сценарий
In [1]: df = DataFrame(randn(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
[]
разрезает только строки (по расположению меток)
Ответ 2
Вы можете думать, что DataFrame является типом серии. df[key]
попробуйте выбрать индекс столбца на key
и вернет объект Series.
Однако нарезка внутри [] разрезает строки, потому что это очень распространенная операция.
Подробное описание документа можно прочитать:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
Ответ 3
Чтобы получить доступ к таблице pandas на основе индексов, можно также рассмотреть параметр numpy.as_array для преобразования таблицы в массив Numpy как
np_df = df.as_matrix()
а затем
np_df[i]
будет работать.
Ответ 4
Основной задачей оператора индексирования DataFrame, []
является выбор столбцов.
Когда оператор индексирования передается строка или целое число, он пытается найти столбец с этим конкретным именем и вернуть его как Серию.
Итак, в вопросе выше: df[2]
ищет имя столбца, соответствующее целочисленному значению 2
. Этот столбец не существует, а a KeyError
.
Оператор индексирования DataFrame полностью изменяет поведение для выбора строк при использовании нотации среза
Странно, когда заданный срез, оператор индексирования DataFrame выбирает строки и может делать это по целочисленному местоположению или по метке индекса.
df[2:3]
Это будет срез, начинающийся с строки с целым числом 2 до 3, за исключением последнего элемента. Итак, всего одна строка. Следующие выбирают строки, начинающиеся с целого местоположения 6, но не включающие 20 каждой третьей строки.
df[6:20:3]
Вы также можете использовать срезы, состоящие из строковых меток, если в вашем индексе DataFrame есть строки. Для получения дополнительной информации см. это решение на .iloc vs .loc.
Я почти никогда не использую эту нотацию фрагмента с индексирующим оператором, поскольку он не явчен и почти никогда не используется. При нарезке по строкам придерживайтесь .loc/.iloc
.
Ответ 5
Вы можете посмотреть исходный код.
DataFrame
имеет частную функцию _slice()
, чтобы нарезать DataFrame
, и позволяет параметру axis
определять, какая ось для среза. __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)
Ответ 6
вы можете прокручивать кадр данных, как это.
for ad in range(1,dataframe_c.size):
print(dataframe_c.values[ad])