web-dev-qa-db-fra.com

Pandas: Pourquoi faut-il des doubles crochets pour sélectionner une colonne après une indexation booléenne?

Pour une table comme ci-dessous,

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

pourquoi les doubles crochets sont-ils nécessaires pour sélectionner des colonnes spécifiques après l'indexation booléenne? 

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

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

Pour les objets pandas (Series, DataFrame), l’opérateur d’indexation [] accepte uniquement 

  1. colname ou liste de noms de colonnes pour sélectionner les colonnes 
  2. trancher ou un tableau booléen pour sélectionner une ou plusieurs lignes, c’est-à-dire qu’il ne fait référence qu’à une seule dimension du cadre de données.

Pour df[[colname(s)]], les crochets intérieurs sont pour la liste et les crochets extérieurs sont des opérateurs d’indexation, c’est-à-dire que vous devez utiliser des crochets doubles si vous sélectionnez deux colonnes ou plus. Avec un nom de colonne, une paire de crochets renvoie une série, tandis que les crochets doubles renvoient une image.

De plus, df.ix[df['A'] < 3,['A','C']] ou df.loc[df['A'] < 3,['A','C']] est préférable à la sélection chaînée pour éviter de renvoyer une copie par rapport à une vue de la trame de données.

Veuillez vous référer à documentation pandas pour plus de détails

43
Joseph

Parce que vous n’avez pas de colonne nommée 'A','C', c’est ce que vous tenteriez de faire et qui va générer une KeyError, vous devez donc utiliser un itérable pour sous-sélectionner à partir du df.

Alors

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

soulève

KeyError: ('A', 'C')

Ce qui est différent de 

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

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

Ce n'est pas différent d'essayer:

df['A','C']

c'est pourquoi vous avez besoin de doubles crochets:

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

Notez que la méthode moderne consiste à utiliser .ix:

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

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

Pour que vous utilisiez une vue plutôt qu'une copie potentielle

7
EdChum

Parce que les crochets internes ne sont que la syntaxe python (littérale) de la liste. 

Les crochets extérieurs représentent l'opération d'indexation de l'objet pandas Dataframe.

Dans ce cas d'utilisation inner ['A', 'B'] définit la liste des colonnes à transmettre en tant qu'argument unique à l'opération d'indexation, indiquée par des crochets externes. 

2
Pavel Savara