Pour sélectionner la ith
ligne, utiliseziloc
:
In [31]: df_test.iloc[0]
Out[31]:
ATime 1.2
X 2.0
Y 15.0
Z 2.0
Btime 1.2
C 12.0
D 25.0
E 12.0
Name: 0, dtype: float64
Pour sélectionner la ième valeur dans la Btime
colonne, vous pouvez utiliser:
In [30]: df_test['Btime'].iloc[0]
Out[30]: 1.2
Il y a une différence entre df_test['Btime'].iloc[0]
(recommandé) et df_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
affecte df_test
, mais df_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
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 ,
df.loc[df.index[n], 'Btime'] = x
ou
df.iloc[n, df.columns.get_loc('Btime')] = x
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 à la
df.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) et df['Btime'].iloc[n] = x
peut donc être utilisé pour affecter une nouvelle valeur au nième emplacement de la Btime
colonne de df
.
É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 à modifier df
:
In [22]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])
In [24]: df['bar'] = 100
In [25]: df['bar'].iloc[0] = 99
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
self._setitem_with_indexer(indexer, value)
In [26]: df
Out[26]:
foo bar
0 A 99 <-- assignment succeeded
2 B 100
1 C 100
df.iloc[0]['Btime'] = x
ne marche pas:
En revanche, l'affectation avec df.iloc[0]['bar'] = 123
ne fonctionne pas car df.iloc[0]
renvoie une copie:
In [66]: df.iloc[0]['bar'] = 123
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
In [67]: df
Out[67]:
foo bar
0 A 99 <-- assignment failed
2 B 100
1 C 100
Avertissement : j'avais déjà suggéré df_test.ix[i, 'Btime']
. Mais cela n'est pas garanti pour vous donner la ith
valeur car ix
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'utilisation ix[i]
retournera la ligne étiquetée i
plutôt que la ith
ligne. Par exemple,
In [1]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])
In [2]: df
Out[2]:
foo
0 A
2 B
1 C
In [4]: df.ix[1, 'foo']
Out[4]: 'C'
df_test.head(1)
fonctionne, le formulaire plus général est d'utiliseriloc
comme répondu par unutbu