2016-03-07 13 views
5

Ho eseguito il seguente codice Python, che crea un Pandas dataframe con due serie (a e b), e poi tenta di creare due nuove serie (c e d):creando una serie Panda con un punto nel nome

La mia comprensione è che se una serie di Pandas fa parte di un DataFrame e il nome della serie non ha spazi (e non si scontrano con un attributo o metodo esistente), è possibile accedere alla serie come attributo di il DataFrame. Come tale, mi aspettavo che la riga riga 3 funzionasse (poiché è così che si crea una nuova serie Pandas) e mi aspettavo che la riga non funzionasse (poiché l'attributo d non esiste per DataFrame fino a quando non lo si esegue riga di codice).

Con mia sorpresa, la riga 4 non ha provocato un errore. Invece, il dataframe ora contiene tre serie:

>>> df 
    a b c 
0 1 4 5 
1 2 5 7 
2 3 6 9 

E c'è un nuovo oggetto, df.d, che è una serie Pandas:

>>> df.d 
0 5 
1 7 
2 9 
dtype: int64 

>>> type(df.d) 
pandas.core.series.Series 

Le mie domande sono le seguenti:

  • Perché la riga 4 non ha provocato un errore?
  • df.d è una serie di pani "normale" con tutte le funzionalità della serie normale?
  • È df.d in qualsiasi modo "connesso" al DataFrame df o è un oggetto completamente indipendente?

mia motivazione a questa domanda è semplicemente che voglio capire meglio Panda, e non perché non v'è un particolare caso d'uso per la linea 4. versione

mio Python è 2.7.11, e le mie Panda la versione è 0.17.1.

risposta

6

Quando si esegue l'assegnazione, è necessario utilizzare la notazione della parentesi, ad es. df['d'] = ...

d è ora una proprietà del dataframe df. Come con qualsiasi oggetto, puoi assegnare loro delle proprietà. Questo è il motivo per cui non ha generato l'errore. Semplicemente non si è comportato come previsto ...

df.some_property = 'What?' 
>>> df.some_property 
'What?' 

Si tratta di uno spazio comune di incomprensione per i principianti di panda. Sempre utilizzare la notazione della parentesi per l'assegnazione. La notazione a punti è utile quando si fa riferimento al dataframe/serie. Per sicurezza, puoi sempre usare la notazione della parentesi.

E sì, df.d per l'esempio è una serie normale che ora è una proprietà imprevista del dataframe. Questa serie è il suo oggetto, collegato dal riferimento creato quando lo hai assegnato a df.

1

@ La risposta di Alexander è buona.Ma solo per chiarire, non è la specificità di un panda, ma piuttosto la specificità di un pitone, vedi qui per una questione connessa:

Why is adding attributes to an already instantiated object allowed in Python?

quanto riguarda la tua ultima domanda, la serie non è collegata (dipende da cosa si intende Collegato però). Ma, immaginate questo:

df = pd.DataFrame({'a':[1, 2, 3], 'b':[4, 5, 6]}) 
df.d = df.a + df.b 
df.sort("a", ascending=False, inplace=True) 
df 
    a b 
2 3 6 
1 2 5 
0 1 4 

df.d 
0 5 
1 7 
2 9 
dtype: int64 

Quindi df.d non è stato ordinato, mentre df.a e df.b hanno.

+0

Questa è stata un'utile aggiunta alla risposta di Alexander, grazie! –

Problemi correlati