Pandas: зачем нужны двойные скобки для выбора столбца после булевской индексации

Для таблицы df, как показано ниже,

   A B C D
0  0 1 1 1
1  2 3 5 7
3  3 1 2 8

почему нужны двойные скобки для выбора определенных столбцов после булевской индексации?

the [['A','C']] part of

df[df['A'] < 3][['A','C']]

Ответ 1

Для объектов pandas (Series, DataFrame) оператор индексирования [] принимает только

  • colname или список столбцов для выбора столбцов.
  • slicing или Boolean array для выбора строки (строк), то есть она относится только к одному измерению кадра данных.

Для df[[colname(s)]] внутренние скобки для списка, а внешние скобки - это оператор индексирования, т.е. вы должны использовать двойные скобки, если вы выберете два или более столбца. С одним именем столбца одна пара скобок возвращает серию, а двойные скобки возвращают фрейм данных.

Кроме того, df.ix[df['A'] < 3,['A','C']] или df.loc[df['A'] < 3,['A','C']] лучше, чем прикованный выбор, чтобы избежать возврата копии по сравнению с представлением данных.

Подробнее см. pandas.

Ответ 2

Поскольку у вас нет столбцов с именем 'A','C', это то, что вы пытаетесь сделать, что поднимет KeyError, поэтому вам нужно использовать итеративный для подвыборки из df.

Итак,

df[df['A'] < 3]['A','C']

повышений

KeyError: ('A', 'C')

Что отличается от

In [261]:
df[df['A'] < 3][['A','C']]

Out[261]:
   A  C
0  0  1
1  2  5

Это не похоже на попытку:

df['A','C']

следовательно, для этого вам нужны двойные квадратные скобки:

df[['A','C']]

Обратите внимание, что современный способ заключается в использовании .ix:

In [264]:
df.ix[df['A'] < 3,['A','C']]

Out[264]:
   A  C
0  0  1
1  2  5

Итак, вы работаете с представлением, а не с потенциально копией