Cela semble être une question ridiculement facile ... mais je ne vois pas la réponse facile que j'attendais.
Alors, comment puis-je obtenir la valeur à une nième ligne d'une colonne donnée dans Pandas? (Je suis particulièrement intéressé par la première ligne, mais je serais également intéressé par une pratique plus générale).
Par exemple, disons que je veux extraire la valeur 1.2 dans Btime en tant que variable.
Quelle est la bonne façon de procéder?
df_test =
ATime X Y Z Btime C D E
0 1.2 2 15 2 1.2 12 25 12
1 1.4 3 12 1 1.3 13 22 11
2 1.5 1 10 6 1.4 11 20 16
3 1.6 2 9 10 1.7 12 29 12
4 1.9 1 1 9 1.9 11 21 19
5 2.0 0 0 0 2.0 8 10 11
6 2.4 0 0 0 2.4 10 12 15
df_test.head(1)
fonctionne, le formulaire plus général est d'utiliseriloc
comme répondu par unutbu1.2
? ou la série de longueur 1 que vous obtenezdf_test.head(1)
, qui contiendra également l'index? Pour obtenir juste la valeur fairedf_test.head(1).item()
, outolist()
alors tranche.Réponses:
Pour sélectionner la
ith
ligne, utiliseziloc
:Pour sélectionner la ième valeur dans la
Btime
colonne, vous pouvez utiliser:Il y a une différence entre
df_test['Btime'].iloc[0]
(recommandé) etdf_test.iloc[0]['Btime']
:Les DataFrames stockent les données dans des blocs basés sur des colonnes (où chaque bloc a un seul type). Si vous sélectionnez d'abord par colonne, une vue peut être renvoyée (ce qui est plus rapide que le renvoi d'une copie) et le type d'origine est conservé. En revanche, si vous sélectionnez d'abord par ligne et si le DataFrame a des colonnes de dtypes différents, Pandas copie les données dans une nouvelle série de dtype d'objet. La sélection de colonnes est donc un peu plus rapide que la sélection de lignes. Ainsi, bien que
df_test.iloc[0]['Btime']
fonctionne,df_test['Btime'].iloc[0]
est un peu plus efficace.Il y a une grande différence entre les deux en ce qui concerne l'affectation.
df_test['Btime'].iloc[0] = x
affectedf_test
, maisdf_test.iloc[0]['Btime']
peut ne pas. Voir ci-dessous pour une explication de pourquoi. Étant donné qu'une différence subtile dans l'ordre d'indexation fait une grande différence de comportement, il est préférable d'utiliser une affectation d'indexation unique:df.iloc[0, df.columns.get_loc('Btime')] = x
(conseillé):La façon recommandée d'affecter de nouvelles valeurs à un DataFrame est d' éviter l'indexation chaînée et d'utiliser à la place la méthode indiquée par andrew ,
ou
Cette dernière méthode est un peu plus rapide, car
df.loc
elle doit convertir les étiquettes de ligne et de colonne en indices positionnels, il y a donc un peu moins de conversion nécessaire si vous utilisez à ladf.iloc
place.df['Btime'].iloc[0] = x
fonctionne, mais n'est pas recommandé:Bien que cela fonctionne, il tire parti de la façon dont les DataFrames sont actuellement implémentés. Il n'y a aucune garantie que les Pandas doivent fonctionner de cette façon à l'avenir. En particulier, il profite du fait que (actuellement)
df['Btime']
renvoie toujours une vue (pas une copie) etdf['Btime'].iloc[n] = x
peut donc être utilisé pour affecter une nouvelle valeur au nième emplacement de laBtime
colonne dedf
.Étant donné que Pandas ne donne aucune garantie explicite sur le moment où les indexeurs retournent une vue par rapport à une copie, les affectations qui utilisent l'indexation chaînée génèrent généralement toujours un
SettingWithCopyWarning
même si dans ce cas, l'affectation réussit à modifierdf
:df.iloc[0]['Btime'] = x
ne marche pas:En revanche, l'affectation avec
df.iloc[0]['bar'] = 123
ne fonctionne pas cardf.iloc[0]
renvoie une copie:Avertissement : j'avais déjà suggéré
df_test.ix[i, 'Btime']
. Mais cela n'est pas garanti pour vous donner laith
valeur carix
essaie d'indexer par étiquette avant d'essayer d'indexer par position . Donc, si le DataFrame a un index entier qui n'est pas dans l'ordre trié à partir de 0, alors l'utilisationix[i]
retournera la ligne étiquetéei
plutôt que laith
ligne. Par exemple,la source
df_test.iloc[0]['Btime']
fonctionne,df_test.iloc['Btime'][0]
est un peu plus efficace.df['Btime'].iloc[0]
préféré àdf['Btime'].values[0]
? je peux voir dans la documentation qu'il dit "Avertissement: Nous vous recommandons d'utiliser Series.array ou Series.to_numpy (), selon que vous avez besoin d'une référence aux données sous-jacentes ou d'un tableau NumPy." mais je ne sais pas exactement ce que cela signifieNotez que la réponse de @unutbu sera correcte jusqu'à ce que vous souhaitiez définir la valeur sur quelque chose de nouveau, alors cela ne fonctionnera pas si votre trame de données est une vue.
Une autre approche qui fonctionnera de manière cohérente avec la définition et l'obtention est la suivante:
la source
Une autre façon de procéder:
Cette façon semble être plus rapide que d'utiliser
.iloc
:la source
df.iloc[0].head(1)
- Premier ensemble de données uniquement à partir de la première ligne entière.df.iloc[0]
- Première ligne entière dans la colonne.la source
De manière générale, si vous souhaitez récupérer les N premières lignes de la colonne J de
pandas dataframe
la meilleure façon de procéder, procédez comme suit:la source
Pour obtenir par exemple la valeur de la colonne 'test' et de la ligne 1, cela fonctionne comme
comme
df[['test']].values[0]
redonne seulement un tableaula source
Une autre façon d'obtenir la première ligne et de conserver l'index:
la source