Pourquoi utilisons-nous 'loc' pour pandas dataframes? Il semble que le code suivant avec ou sans utilisation de loc compile et s'exécute à une vitesse simululaire
%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 loc?
Modifier: Cela a été signalé comme une question en double. Mais bien que pandas iloc vs ix vs loc explication? ne mentionne que *
vous pouvez faire une récupération de colonne en utilisant simplement le cadre de données getitem:
*
df['time'] # equivalent to df.loc[:, 'time']
il ne dit pas pourquoi nous utilisons loc, bien qu'il explique de nombreuses fonctionnalités de loc, ma question spécifique est "pourquoi ne pas simplement supprimer loc"? pour lequel j'ai accepté une réponse très détaillée ci-dessous.
De plus, cet autre message, la réponse (que je ne pense pas être une réponse) est très cachée dans la discussion et toute personne recherchant ce que je cherchais aurait du mal à localiser les informations et serait beaucoup mieux servie par la réponse fournie à ma question.
Explicite vaut mieux qu'implicite.
df[boolean_mask]
Sélectionne les lignes où boolean_mask
Est Vrai, mais il y a un cas de coin lorsque vous ne le voudrez peut-être pas: lorsque df
a des étiquettes de colonne de valeur booléenne:
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 souhaiterez peut-être utiliser df[[True]]
Pour sélectionner la colonne True
. Au lieu de cela, il soulève un ValueError
:
In [230]: df[[True]]
ValueError: Item wrong length 1 instead of 3.
Versus utilisant loc
:
In [231]: df.loc[[True]]
Out[231]:
False True
0 3 1
En revanche, ce qui suit ne soulève pas ValueError
même si la structure de df2
Est presque la 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 comporte pas toujours de la même manière que df.loc[boolean_mask]
. Même si c'est sans doute un cas d'utilisation peu probable, je recommanderais toujours d'utiliser df.loc[boolean_mask]
Au lieu de df[boolean_mask]
Car la signification de la syntaxe de df.loc
Est explicite. Avec df.loc[indexer]
, Vous savez automatiquement que df.loc
Sélectionne des lignes. En revanche, il n'est pas clair si df[indexer]
Sélectionnera des lignes ou des colonnes (ou augmentera ValueError
) sans connaître les détails sur indexer
et df
.
df.loc[row_indexer, column_index]
Peut sélectionner des lignes et colonnes. df[indexer]
Ne peut sélectionner que des lignes o colonnes selon le type de valeurs dans indexer
et le type de valeurs de colonne df
a (encore une fois, sont-elles booléen?).
In [237]: df2.loc[[True,False,True], 'B']
Out[237]:
0 3
2 5
Name: B, dtype: int64
Lorsqu'une tranche est passée à df.loc
, Les points finaux sont inclus dans la plage. Lorsqu'une tranche est passée à df[...]
, La tranche est interprétée comme un intervalle semi-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