Выбор ряда серий / данных панд по целочисленному индексу

395

Мне любопытно, почему 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. Есть ли конструктивная причина не поддерживать индексирование строки одним целым числом?

cs95
источник
4
df.ix[2]не работает - по крайней мере, не вpandas version '0.19.2'
Захра
9
Чтобы увидеть разницу между выбором строк и столбцов с помощью оператора индексации [], см. Ответ ниже . Также НИКОГДА НЕ ИСПОЛЬЗОВАТЬ .ix, это устарело
Тед Петру

Ответы:

552

повторяя @HYRY, см. новые документы в 0.11

http://pandas.pydata.org/pandas-docs/stable/indexing.html

Здесь у нас есть новые операторы, .ilocдля 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

[] разрезает только строки (по расположению метки)

Джефф
источник
7
Что если вы хотите 2-й, 3-й и 4-й ряд?
FaCoffee,
1
Вы можете просто передать список индексаторов; документы указаны выше
Джефф
2
У кого-нибудь есть оправдание этим именам? Мне трудно запомнить их, потому что я не уверен, почему ilocстроки и locметки.
килоджоулей
3
@kilojoules .ilocищет вещи по их порядку в индексе (например, .iloc[[2]]это вторая «строка» в) df. Эта строка находится в позиции индекса4 . .locищет их по значению индекса. Так может быть, "iloc" это как "я", как в A[i]? :)
Джим К.
1
@Джефф - это прекрасно работает, но что произойдет, если вы захотите продублировать строку из вашего фрейма данных, например df.loc[-1] = df.iloc[[0]], и вставить это? Кадр поставляется с добавленным индексным столбцом с ошибкой ValueError: cannot set a row with mismatched columns (см. Stackoverflow.com/questions/47340571/… )
Growler
63

Основная цель оператора индексации DataFrame []- выбор столбцов.

Когда оператору индексирования передается строка или целое число, он пытается найти столбец с этим конкретным именем и вернуть его как ряд.

Итак, в вопросе выше: df[2]ищет имя столбца, совпадающее с целочисленным значением 2. Этот столбец не существует, и KeyErrorон поднимается.


Оператор индексации DataFrame полностью меняет поведение для выбора строк при использовании обозначения среза

Как ни странно, если задан фрагмент, оператор индексации DataFrame выбирает строки и может делать это по целому расположению или по метке индекса.

df[2:3]

Это будет срез, начиная со строки с целочисленным местоположением от 2 до 3, исключая последний элемент. Итак, всего один ряд. Следующее выбирает строки, начинающиеся с целочисленного местоположения 6 до, но не включая 20 каждой третьей строкой.

df[6:20:3]

Вы также можете использовать фрагменты, состоящие из строковых меток, если в вашем индексе DataFrame есть строки. Для получения дополнительной информации см. Это решение на .iloc против .loc .

Я почти никогда не использую эту запись слайса с оператором индексации, так как он не является явным и почти никогда не используется. При нарезке по строкам придерживайтесь .loc/.iloc.

Тед Петру
источник
Попытка добавить строки в другой фрейм данных с помощью оператора indxeing, но другой фрейм остается пустым. Почему?
FindOutIslamNow
23

Вы можете думать о DataFrame как о канале Series. df[key]попытаться выбрать индекс столбца keyи вернуть объект Series.

Однако нарезка внутри [] разделяет строки, потому что это очень распространенная операция.

Вы можете прочитать документ для деталей:

http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics

HYRY
источник
Спасибо за подсказку. Забавно, такого рода вещи иногда вызывают вопросы у панд. Добавляя исключения к поведению в определенных ситуациях, ... мне кажется, что нужно пожертвовать последовательностью ради небольшого удобства.
Карл Бергер
15

Чтобы получить доступ к таблице панд на основе индекса, можно также рассмотреть параметр numpy.as_array, чтобы преобразовать таблицу в массив Numpy как

np_df = df.as_matrix()

а потом

np_df[i] 

должно сработать.

Павел Прочазка
источник
11
который побеждает всю цель индексов фреймов данных и всего остального, что предлагает pandas
Фабио Диас
6

Вы можете взглянуть на исходный код .

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)
waitingkuo
источник
5

Вы можете перебирать фрейм данных, как это.

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
user1401491
источник