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']] лучше, чем прикованный выбор, чтобы избежать возврата копии по сравнению с представлением данных.
Поскольку у вас нет столбцов с именем '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
Итак, вы работаете с представлением, а не с потенциально копией