100 votes

Python: Pandas Series - Pourquoi utiliser loc?

Pourquoi utilisons-nous des " loc " pour les pandas dataframes? il semble que le code suivant avec ou sans l'aide de loc à la fois de la compilation de l'anr s'exécuter à une vitesse simulular

%timeit df_user1 = df.loc[df.user_id=='5561']

100 loops, best of 3: 11.9 ms per loop

ou

%timeit df_user1_noloc = df[df.user_id=='5561']

100 loops, best of 3: 12 ms per loop

Alors pourquoi utiliser de la ldc?

Edit: Ce qui a été marqué comme une double question. Mais bien que les pandas lci vs ix vs loc explication? ne mentionne qu' *

vous pouvez faire de la colonne d'extraction en utilisant le bloc de données getitem:

*

df['time']    # equivalent to df.loc[:, 'time']

il ne dit pas pourquoi nous utilisons la ldc, bien que cela explique beaucoup de fonctionnalités de loc, mon question est "pourquoi ne pas omettre loc complètement'? pour lequel j'ai reçu une réponse très détaillée ci-dessous.

Aussi que d'autres post la réponse (que je ne crois pas que ce soit une réponse) est très caché dans la discussion et toute personne à la recherche de ce que je cherchais trouverez qu'il est difficile de localiser les informations et serait beaucoup mieux servi par la réponse à ma question.

89voto

unutbu Points 222216
  • Explicite est mieux qu'implicites.

    df[boolean_mask] sélectionne les lignes où boolean_mask est Vrai, mais il est un coin de cas où vous ne pourriez pas le souhaitez: quand df a boolean-valeur de la colonne des étiquettes:

    In [229]: df = pd.DataFrame({True:[1,2,3],False:[3,4,5]}); df
    Out[229]: 
       False  True 
    0      3      1
    1      4      2
    2      5      3
    

    Vous pouvez utiliser df[[True]] pour sélectionner l' True colonne. Au lieu de cela, il soulève ValueError:

    In [230]: df[[True]]
    ValueError: Item wrong length 1 instead of 3.
    

    Comparativement à l'utilisation d' loc:

    In [231]: df.loc[[True]]
    Out[231]: 
       False  True 
    0      3      1
    

    En revanche, les suivantes ne soulève ValueError , même si la structure de l' df2 est presque le même que df1 ci-dessus:

    In [258]: df2 = pd.DataFrame({'A':[1,2,3],'B':[3,4,5]}); df2
    Out[258]: 
       A  B
    0  1  3
    1  2  4
    2  3  5
    
    In [259]: df2[['B']]
    Out[259]: 
       B
    0  3
    1  4
    2  5
    

    Ainsi, df[boolean_mask] ne se comportent pas toujours de la même chose que df.loc[boolean_mask]. Même si c'est sans doute un cas d'utilisation peu probable, je vous recommande de toujours utiliser df.loc[boolean_mask] au lieu de df[boolean_mask] parce que le sens de l' df.locs'syntaxe est explicite. Avec df.loc[indexer] vous savez automatiquement df.loc est la sélection de lignes. En revanche, il n'est pas clair si df[indexer] permettra de sélectionner des lignes ou des colonnes (ou relance ValueError) sans connaître les détails à propos de indexer et df.

  • df.loc[row_indexer, column_index] pouvez sélectionner des lignes et des colonnes. df[indexer] pouvez uniquement sélectionner des lignes ou des colonnes en fonction du type de valeurs en indexer et le type des valeurs de la colonne df a (encore une fois, sont-ils boolean?).

    In [237]: df2.loc[[True,False,True], 'B']
    Out[237]: 
    0    3
    2    5
    Name: B, dtype: int64
    
  • Lorsqu'une tranche est passé de df.loc les points d'arrêt sont inclus dans la gamme. Lorsqu'une tranche est passé de df[...], la tranche est interprété comme un demi-intervalle ouvert:

    In [239]: df2.loc[1:2]
    Out[239]: 
       A  B
    1  2  4
    2  3  5
    
    In [271]: df2[1:2]
    Out[271]: 
       A  B
    1  2  4
    

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X