La sélection d'une ligne de pandas série/dataframe par index entier
Je suis curieux de savoir pourquoi df[2]
n'est pas pris en charge, tout en df.ix[2]
et df[2:3]
à la fois le travail.
In [26]: df.ix[2]
Out[26]:
A 1.027680
B 1.514210
C -1.466963
D -0.162339
Name: 2000-01-03 00:00:00
In [27]: df[2:3]
Out[27]:
A B C D
2000-01-03 1.02768 1.51421 -1.466963 -0.162339
Je m'attends à ce df[2]
à fonctionner de la même manière que df[2:3]
pour être cohérent avec Python indexation de la convention. Est-il une conception de la raison pour ne pas soutenir l'indexation ligne par un unique entier?
df.ix[2]
ne fonctionnent pas - du moins pas danspandas version '0.19.2'
- Pour voir la différence entre les lignes et de colonnes à l'aide de l'opérateur d'indexation,
[]
, voir cette réponse ci-dessous. Aussi ne JAMAIS UTILISER.ix
, il est déconseillé
Vous devez vous connecter pour publier un commentaire.
écho @HYRY, voir les nouvelles docs dans 0.11
http://pandas.pydata.org/pandas-docs/stable/indexing.html
Ici, nous avons de nouveaux opérateurs,
.iloc
à explicitement le soutien entiers de l'indexation, et.loc
à explicitement en charge uniquement l'étiquette d'indexationpar exemple, imaginez ce scénario
[]
tranches les lignes (par emplacement de l'étiquette) seulementiloc
est des lignes et desloc
est des étiquettes..iloc[[2]]
) est le deuxième "ligne" dansdf
. Cette ligne se trouve être à index emplacement4
..loc
recherche par leur valeur d'indice. Alors peut-être que "lci", c'est comme "je" comme dansA[i]
? 🙂df.loc[-1] = df.iloc[[0]]
, et de l'insérer? Le cadre est livré avec un indice de colonne donnant erreurValueError: cannot set a row with mismatched columns
(voir stackoverflow.com/questions/47340571/...)df.iloc[[2]]
retourne un dataframe etdf.iloc[2]
renvoie unepandas.core.series.Series
? Pourquoi je devrais utiliser l'un plutôt que l'autre?Le but principal de la DataFrame de l'indexation de l'opérateur,
[]
est de sélectionner les colonnes.Lorsque l'indexation de l'opérateur est passé à une chaîne ou un entier, il tente de trouver une colonne avec le nom et le retourner comme une Série.
Ainsi, dans la question ci-dessus:
df[2]
recherches pour un nom de colonne correspondant à la valeur entière2
. Cette colonne n'existe pas et unKeyError
est soulevée.Le DataFrame de l'indexation de l'opérateur change complètement de comportement pour sélectionner les lignes lors de la tranche de notation est utilisée
Étrangement, lors d'une tranche, le DataFrame de l'indexation de l'opérateur sélectionne des lignes et peuvent le faire en entier emplacement ou par l'indice de l'étiquette.
Cette tranche début de la ligne avec entier emplacement de 2 à 3, à l'exclusion du dernier élément. Donc, il suffit d'une seule ligne. La suivante sélectionne les lignes commençant à l'entier emplacement 6 jusqu'à 20 par chaque troisième ligne.
Vous pouvez également utiliser des tranches composé de la chaîne d'étiquettes si votre DataFrame index a des cordes en elle. Pour plus de détails, voir cette solution sur .lci vs .loc.
Je n'ai presque jamais utiliser cette tranche de la notation à l'indexation de l'opérateur qu'il ne soit pas explicite et presque jamais utilisé. Pour le découpage en lignes, bâton avec
.loc/.iloc
.Vous pouvez penser DataFrame comme dict de la Série.
df[key]
essayez de sélectionner l'index de colonne parkey
et renvoie un objet de Série.Cependant de découpage à l'intérieur de [] tranches les lignes, parce que c'est une opération très courante.
Vous pouvez lire le document pour plus de détails:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
D'accès par index pour les pandas de la table, on peut aussi envisager numpy.as_array option pour convertir le tableau en tableau Numpy comme
et puis
serait de travailler.
Vous pouvez prendre un coup d'oeil à la le code source .
DataFrame
a une fonction privée_slice()
à couper leDataFrame
, et il permet le paramètreaxis
pour déterminer l'axe de la tranche. Le__getitem__()
pourDataFrame
ne pas configurer l'axe, tout en invoquant_slice()
. Ainsi, le_slice()
tranche, par défaut, l'axe 0.Vous pouvez prendre une simple expérience, qui pourrait vous aider:
vous pouvez faire une boucle à travers la trame de données de ce genre .