Sommario: Questo non funziona:intesa panda dataframe indicizzazione
df[df.key==1]['D'] = 1
ma questo fa:
df.D[df.key==1] = 1
Perché?
Riproduzione:
In [1]: import pandas as pd
In [2]: from numpy.random import randn
In [4]: df = pd.DataFrame(randn(6,3),columns=list('ABC'))
In [5]: df
Out[5]:
A B C
0 1.438161 -0.210454 -1.983704
1 -0.283780 -0.371773 0.017580
2 0.552564 -0.610548 0.257276
3 1.931332 0.649179 -1.349062
4 1.656010 -1.373263 1.333079
5 0.944862 -0.657849 1.526811
In [6]: df['D']=0.0
In [7]: df['key']=3*[1]+3*[2]
In [8]: df
Out[8]:
A B C D key
0 1.438161 -0.210454 -1.983704 0 1
1 -0.283780 -0.371773 0.017580 0 1
2 0.552564 -0.610548 0.257276 0 1
3 1.931332 0.649179 -1.349062 0 2
4 1.656010 -1.373263 1.333079 0 2
5 0.944862 -0.657849 1.526811 0 2
Questo non funziona:
In [9]: df[df.key==1]['D'] = 1
In [10]: df
Out[10]:
A B C D key
0 1.438161 -0.210454 -1.983704 0 1
1 -0.283780 -0.371773 0.017580 0 1
2 0.552564 -0.610548 0.257276 0 1
3 1.931332 0.649179 -1.349062 0 2
4 1.656010 -1.373263 1.333079 0 2
5 0.944862 -0.657849 1.526811 0 2
ma questo fa:
In [11]: df.D[df.key==1] = 3.4
In [12]: df
Out[12]:
A B C D key
0 1.438161 -0.210454 -1.983704 3.4 1
1 -0.283780 -0.371773 0.017580 3.4 1
2 0.552564 -0.610548 0.257276 3.4 1
3 1.931332 0.649179 -1.349062 0.0 2
4 1.656010 -1.373263 1.333079 0.0 2
5 0.944862 -0.657849 1.526811 0.0 2
La mia domanda è: Perché solo la 2 ° modo di lavorare? Non riesco a vedere una differenza nella logica di selezione/indicizzazione?
versione è 0.10.0
Edit: Questo non dovrebbe essere fatto in questo modo più. Da 0.11 c'è, vedi qui: http://pandas.pydata.org/pandas-docs/stable/indexing.html
Come detto nelle risposte sembra essere un problema insensibile: dare un'occhiata a [questa domanda] (http://stackoverflow.com/q/9470604/1301710) per un problema simile. Non sono sicuro che si tratti di un problema di vista o di copia. – bmu
Capisco ora che è chiaro (e in realtà semplicemente) la differenza tra la vista e la copia. Il primo metodo fornisce solo una copia che è garbage collection. Il secondo metodo fornisce una vista quindi l'impostazione viene eseguita nel dataframe originale. (vedi i commenti di Dougal sotto) –