2015-09-20 27 views
12

Questa è una domanda molto semplice, non riesco proprio a trovare una risposta.Copia tutti i valori in una colonna in una nuova colonna in un dataframe panda

Ho un dataframe come questo, chiamato df:

A  B  C 
a.1 b.1 c.1 
a.2 b.2 c.2 
a.3 b.3 c.3 

Poi estrarre tutte le righe df, dove la colonna 'B' ha un valore di 'b.2'. Assegno questi risultati a df_2.

df_2 = df[df['B'] == 'b.2'] 

df_2 diventa:

A  B  C 
a.2 b.2 c.2 

Poi, ho copiare tutti i valori nella colonna 'B' ad una nuova colonna denominata 'D'. Causando df_2 a diventare:

A  B  C  D 
a.2 b.2 c.2 b.2 

Quando ho preforme un incarico come questo:

df_2['D'] = df_2['B'] 

ottengo il seguente avvertimento:

Un valore sta cercando di impostare su una copia di una fetta da un DataFrame. Prova utilizzando .loc [row_indexer, col_indexer] = valore invece

Vedi le le avvertenze nella documentazione: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy


ho anche provato ad utilizzare per la creazione di .loc df_2 in questo modo:

df_2 = df.loc[df['B'] == 'b.2'] 

Tuttavia, ho ancora ricevuto l'avviso.

Qualsiasi aiuto è molto apprezzato.

+0

Cosa significa 'mezzi a.1'? È una stringa? –

risposta

22

Si può semplicemente assegnare il B alla nuova colonna, come -

df['D'] = df['B'] 

Esempio/Demo -

In [1]: import pandas as pd 

In [2]: df = pd.DataFrame([['a.1','b.1','c.1'],['a.2','b.2','c.2'],['a.3','b.3','c.3']],columns=['A','B','C']) 

In [3]: df 
Out[3]: 
    A B C 
0 a.1 b.1 c.1 
1 a.2 b.2 c.2 
2 a.3 b.3 c.3 

In [4]: df['D'] = df['B']     #<---What you want. 

In [5]: df 
Out[5]: 
    A B C D 
0 a.1 b.1 c.1 b.1 
1 a.2 b.2 c.2 b.2 
2 a.3 b.3 c.3 b.3 

In [6]: df.loc[0,'D'] = 'd.1' 

In [7]: df 
Out[7]: 
    A B C D 
0 a.1 b.1 c.1 d.1 
1 a.2 b.2 c.2 b.2 
2 a.3 b.3 c.3 b.3 
+0

Hai usato 'df ['D'] = df ['B'] giusto? Non dovresti prenderlo, hai fatto qualcos'altro? –

+3

Grazie! Ottengo: Un valore sta cercando di essere impostato su una copia di una sezione da un DataFrame. Prova a usare.loc [row_indexer, col_indexer] = valore invece Vedere le avvertenze nella documentazione: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy df [' D '] = df [' B '] Sarebbe meglio iterare su ogni riga estraendo il valore e assegnandolo alla nuova colonna? O questo è un non-problema? –

+0

Come ho detto, hai usato 'df ['D'] = df ['B']'? Se no, cos'altro hai usato? –

11

Il problema è nella linea prima di quello che getta il avvertimento. Quando crei df_2 è qui che stai creando una copia di una porzione di un dataframe. Invece, quando crei df_2, usa .copy() e non riceverai quell'avviso più tardi.

df_2 = df[df['B'] == 'b.2'].copy() 
+0

L'ha risolto! Grazie –

+0

che cosa fa esattamente .copy() qui? –

+0

La differenza con .copy() è che restituisce un nuovo oggetto invece di una vista dell'oggetto originale. Quindi se cambi il nuovo oggetto, quello originale non verrà modificato. – Alex

1

penso che il metodo corretto di accesso utilizza l'indice:

df_2.loc[:,'D'] = df_2['B'] 
+1

Solleverà "SettingWithCopyWarning" –

Problemi correlati