una nueva insertar filtrar datos data crear columna añadir agregar python pandas

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