¿Cómo inserto una columna en un índice de columna específico en pandas?

189

¿Puedo insertar una columna en un índice de columna específico en pandas?

import pandas as pd
df = pd.DataFrame({'l':['a','b','c','d'], 'v':[1,2,1,2]})
df['n'] = 0

Esto colocará la columna ncomo la última columna de df, pero ¿no hay una manera de decir dfque se ponga nal principio?

HappyPy
fuente
Inserte una columna al principio (extremo izquierdo) de un DataFrame : más soluciones + solución generalizada para insertar cualquier secuencia (no solo un valor constante).
cs95

Respuestas:

370

ver documentos: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.insert.html

usando loc = 0 se insertará al principio

df.insert(loc, column, value)

df = pd.DataFrame({'B': [1, 2, 3], 'C': [4, 5, 6]})

df
Out: 
   B  C
0  1  4
1  2  5
2  3  6

idx = 0
new_col = [7, 8, 9]  # can be a list, a Series, an array or a scalar   
df.insert(loc=idx, column='A', value=new_col)

df
Out: 
   A  B  C
0  7  1  4
1  8  2  5
2  9  3  6
Jeff
fuente
18
Para futuros usuarios, los nuevos parámetros son "loc", "columna" y "valor" . Fuente
Peter Maguire
11

Puede intentar extraer columnas como lista, masajear esto como desee y volver a indexar su marco de datos:

>>> cols = df.columns.tolist()
>>> cols = [cols[-1]]+cols[:-1] # or whatever change you need
>>> df.reindex(columns=cols)

   n  l  v
0  0  a  1
1  0  b  2
2  0  c  1
3  0  d  2

EDITAR: esto se puede hacer en una línea; Sin embargo, esto se ve un poco feo. Quizás venga alguna propuesta más limpia ...

>>> df.reindex(columns=['n']+df.columns[:-1].tolist())

   n  l  v
0  0  a  1
1  0  b  2
2  0  c  1
3  0  d  2
Nic
fuente
9

Si desea un valor único para todas las filas:

df.insert(0,'name_of_column','')
df['name_of_column'] = value

Editar:

Tú también puedes:

df.insert(0,'name_of_column',value)
Hugo Vares
fuente
0

Aquí hay una respuesta muy simple a esto (solo una línea).

Puede hacerlo después de agregar la columna 'n' en su df de la siguiente manera.

import pandas as pd
df = pd.DataFrame({'l':['a','b','c','d'], 'v':[1,2,1,2]})
df['n'] = 0

df
    l   v   n
0   a   1   0
1   b   2   0
2   c   1   0
3   d   2   0

# here you can add the below code and it should work.
df = df[list('nlv')]
df

    n   l   v
0   0   a   1
1   0   b   2
2   0   c   1
3   0   d   2



However, if you have words in your columns names instead of letters. It should include two brackets around your column names. 

import pandas as pd
df = pd.DataFrame({'Upper':['a','b','c','d'], 'Lower':[1,2,1,2]})
df['Net'] = 0
df['Mid'] = 2
df['Zsore'] = 2

df

    Upper   Lower   Net Mid Zsore
0   a       1       0   2   2
1   b       2       0   2   2
2   c       1       0   2   2
3   d       2       0   2   2

# here you can add below line and it should work 
df = df[list(('Mid','Upper', 'Lower', 'Net','Zsore'))]
df

   Mid  Upper   Lower   Net Zsore
0   2   a       1       0   2
1   2   b       2       0   2
2   2   c       1       0   2
3   2   d       2       0   2
rra
fuente