python - insertar - Copie todos los valores en una columna a una nueva columna en un marco de datos de pandas
insertar columna en pandas (4)
A continuación de estas soluciones, aquí hay un código útil que ilustra:
#
# Copying columns in pandas without slice warning
#
import numpy as np
df = pd.DataFrame(np.random.randn(10, 3), columns=list(''ABC''))
#
# copies column B into new column D
df.loc[:,''D''] = df[''B'']
print df
#
# creates new column ''E'' with values -99
#
# But copy command replaces those where ''B''>0 while others become NaN (not copied)
df[''E''] = -99
print df
df[''E''] = df[df[''B'']>0][''B''].copy()
print df
#
# creates new column ''F'' with values -99
#
# Copy command only overwrites values which meet criteria ''B''>0
df[''F'']=-99
df.loc[df[''B'']>0,''F''] = df[df[''B'']>0][''B''].copy()
print df
Esta es una pregunta muy básica, simplemente no puedo encontrar una respuesta.
Tengo un marco de datos como este, llamado df:
A B C
a.1 b.1 c.1
a.2 b.2 c.2
a.3 b.3 c.3
Luego extraigo todas las filas de df, donde la columna ''B'' tiene un valor de ''b.2''. Asigno estos resultados a df_2.
df_2 = df[df[''B''] == ''b.2'']
df_2 se convierte en:
A B C
a.2 b.2 c.2
Luego, copio todos los valores en la columna ''B'' a una nueva columna llamada ''D''. Haciendo que df_2 se convierta en:
A B C D
a.2 b.2 c.2 b.2
Cuando preformo una tarea como esta:
df_2[''D''] = df_2[''B'']
Me sale la siguiente advertencia:
Se está intentando establecer un valor en una copia de un sector desde un DataFrame. Intente usar .loc [row_indexer, col_indexer] = value en su lugar
Vea las advertencias en la documentación: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
También he intentado usar .loc al crear df_2 de esta manera:
df_2 = df.loc[df[''B''] == ''b.2'']
Sin embargo, todavía recibo la advertencia.
Cualquier ayuda es muy apreciada.
Creo que el método de acceso correcto está utilizando el índice:
df_2.loc[:,''D''] = df_2[''B'']
El problema está en la línea anterior a la que lanza la advertencia. Cuando crea df_2 es donde está creando una copia de una porción de un marco de datos. En su lugar, cuando cree df_2, use .copy () y no recibirá esa advertencia más adelante.
df_2 = df[df[''B''] == ''b.2''].copy()
Simplemente puede asignar la B
a la nueva columna, como -
df[''D''] = df[''B'']
Ejemplo / 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