Je suis curieux de savoir pourquoi df[2]
n'est pas pris en charge, tandis que df.ix[2]
et les df[2:3]
deux fonctionnent.
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'attendrais df[2]
à travailler de la même manière que df[2:3]
pour être cohérent avec la convention d'indexation Python. Existe-t-il une raison de conception pour ne pas prendre en charge l'indexation des lignes par un seul entier?
df.ix[2]
ne fonctionne pas - du moins paspandas version '0.19.2'
[]
, consultez cette réponse ci-dessous . Aussi NE JAMAIS UTILISER.ix
, il est obsolèteRéponses:
faisant écho à @HYRY, voir les nouveaux documents en 0.11
http://pandas.pydata.org/pandas-docs/stable/indexing.html
Ici, nous avons de nouveaux opérateurs,
.iloc
explicitement ne supporte que l'indexation entière et.loc
explicite ne supporte que l'indexation d'étiquettepar exemple imaginez ce scénario
[]
coupe les lignes (par emplacement d'étiquette) uniquementla source
iloc
lignes et lesloc
étiquettes sont..iloc
recherche les choses par ordre dans l'index (par exemple.iloc[[2]]
) est la deuxième "ligne" dansdf
. Cette ligne se trouve à l' emplacement de l' index4
..loc
les recherche par leur valeur d'index. Alors peut-être "iloc" est comme "i" comme dansA[i]
? :)df.loc[-1] = df.iloc[[0]]
, et l'insérer? Le cadre est livré avec une colonne d'index ajoutée donnant une erreurValueError: cannot set a row with mismatched columns
(voir stackoverflow.com/questions/47340571/… )L'objectif principal de l'opérateur d'indexation DataFrame
[]
est de sélectionner des colonnes.Lorsque l'opérateur d'indexation reçoit une chaîne ou un entier, il tente de trouver une colonne portant ce nom particulier et de la renvoyer en tant que série.
Donc, dans la question ci-dessus:
df[2]
recherche un nom de colonne correspondant à la valeur entière2
. Cette colonne n'existe pas et unKeyError
est levé.L'opérateur d'indexation DataFrame change complètement de comportement pour sélectionner des lignes lorsque la notation de tranche est utilisée
Étrangement, lorsqu'il reçoit une tranche, l'opérateur d'indexation DataFrame sélectionne des lignes et peut le faire par emplacement entier ou par étiquette d'index.
Cela coupera à partir de la ligne avec l'emplacement entier 2 à 3, à l'exclusion du dernier élément. Donc, juste une seule rangée. Ce qui suit sélectionne les lignes commençant à l'emplacement entier 6 jusqu'à 20, sans y inclure, toutes les trois lignes.
Vous pouvez également utiliser des tranches composées d'étiquettes de chaîne si votre index DataFrame contient des chaînes. Pour plus de détails, consultez cette solution sur .iloc vs .loc .
Je n'utilise presque jamais cette notation de tranche avec l'opérateur d'indexation car elle n'est pas explicite et presque jamais utilisée. Lorsque vous coupez en rangées, respectez
.loc/.iloc
.la source
Vous pouvez penser DataFrame comme un dict de Series.
df[key]
essayez de sélectionner l'index de colonne parkey
et retourne un objet Series.Cependant, trancher à l'intérieur de [] tranche les lignes, car 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
la source
Pour accéder par index à la table pandas, on peut également envisager l' option numpy.as_array pour convertir la table en tableau Numpy en tant que
et alors
travaillerait.
la source
Vous pouvez jeter un œil au code source .
DataFrame
a une fonction privée_slice()
pour trancher leDataFrame
, et il permet au paramètreaxis
de déterminer quel axe couper. Le__getitem__()
forDataFrame
ne définit pas l'axe lors de l'appel_slice()
. Donc, le_slice()
couper par défaut par axe 0.Vous pouvez faire une expérience simple, qui pourrait vous aider:
la source
vous pouvez parcourir la trame de données comme ceci.
la source