Per selezionare la ith
riga, utilizzareiloc
:
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
Per selezionare il valore ith nella Btime
colonna è possibile utilizzare:
In [30]: df_test['Btime'].iloc[0]
Out[30]: 1.2
C'è una differenza tra df_test['Btime'].iloc[0]
(consigliato) e df_test.iloc[0]['Btime']
:
DataFrames memorizza i dati in blocchi basati su colonne (dove ogni blocco ha un solo tipo). Se si seleziona prima per colonna, è possibile restituire una vista (che è più veloce della restituzione di una copia) e il tipo originale viene conservato. Al contrario, se si seleziona prima per riga e se DataFrame ha colonne di tipi diversi, Pandas copia i dati in una nuova serie di tipi tipo. Quindi la selezione delle colonne è un po 'più veloce della selezione delle righe. Pertanto, sebbene
df_test.iloc[0]['Btime']
funzioni, df_test['Btime'].iloc[0]
è un po 'più efficiente.
C'è una grande differenza tra i due quando si tratta di assegnazione.
df_test['Btime'].iloc[0] = x
colpisce df_test
, ma df_test.iloc[0]['Btime']
potrebbe non farlo. Vedi sotto per una spiegazione del perché. Poiché una sottile differenza nell'ordine di indicizzazione fa una grande differenza nel comportamento, è meglio usare una singola assegnazione di indicizzazione:
df.iloc[0, df.columns.get_loc('Btime')] = x
df.iloc[0, df.columns.get_loc('Btime')] = x
(consigliato):
Il modo consigliato per assegnare nuovi valori a un DataFrame è evitare l'indicizzazione concatenata e utilizzare invece il metodo mostrato da andrew ,
df.loc[df.index[n], 'Btime'] = x
o
df.iloc[n, df.columns.get_loc('Btime')] = x
Quest'ultimo metodo è un po 'più veloce, perché df.loc
deve convertire le etichette di riga e colonna in indici posizionali, quindi è necessaria una conversione un po' meno se si utilizza
df.iloc
invece.
df['Btime'].iloc[0] = x
funziona, ma non è raccomandato:
Sebbene funzioni, sta sfruttando il modo in cui i DataFrames sono attualmente implementati. Non vi è alcuna garanzia che i panda debbano lavorare in questo modo in futuro. In particolare, sta sfruttando il fatto che (attualmente) df['Btime']
restituisce sempre una vista (non una copia), quindi df['Btime'].iloc[n] = x
può essere utilizzato per assegnare un nuovo valore all'ennesima posizione della Btime
colonna di df
.
Poiché Pandas non fornisce garanzie esplicite su quando gli indicizzatori restituiscono una vista rispetto a una copia, le assegnazioni che utilizzano l'indicizzazione concatenata generano sempre un valore SettingWithCopyWarning
anche se in questo caso l'assegnazione riesce a modificare 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
non funziona:
Al contrario, l'assegnazione con df.iloc[0]['bar'] = 123
non funziona perché df.iloc[0]
restituisce una copia:
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
Attenzione : avevo precedentemente suggerito df_test.ix[i, 'Btime']
. Ma questo non è garantito per darti il ith
valore poiché ix
cerca di indicizzare per etichetta prima di provare a indicizzare per posizione . Quindi, se DataFrame ha un indice intero che non è in ordine ordinato a partire da 0, allora l'utilizzo ix[i]
restituirà la riga etichettata i
anziché la ith
riga. Per esempio,
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)
funzionasse, il modulo più generale è quello di utilizzareiloc
come risposta da unutbu