Dado un DataFrame:

np.random.seed(0)
df = pd.DataFrame(np.random.randn(3, 3), columns=list('ABC'), index=[1, 2, 3])
df

          A         B         C
1  1.764052  0.400157  0.978738
2  2.240893  1.867558 -0.977278
3  0.950088 -0.151357 -0.103219

¿Cuál es la manera más sencilla de añadir una nueva columna que contiene un valor constante, por ejemplo 0?

          A         B         C  new
1  1.764052  0.400157  0.978738    0
2  2.240893  1.867558 -0.977278    0
3  0.950088 -0.151357 -0.103219    0

Esta es mi solución, pero no sé por qué esto pone NaN en la ‘nueva’ columna?

df['new'] = pd.Series([0 for x in range(len(df.index))])

          A         B         C  new
1  1.764052  0.400157  0.978738  0.0
2  2.240893  1.867558 -0.977278  0.0
3  0.950088 -0.151357 -0.103219  NaN
  • si se utiliza un índice de su bien. df['new'] = pd.Series([0 for x in range(len(df.index))], index=df.index).
  • también, una lista de comprensión es totalmente innecesario aquí. acaba de hacer [0] * len(df.index)
  • Quiero decir que el df[‘nuevo’]=0 muestra el correcto por qué de la asignación de ceros a toda la columna, pero no explica por qué mi primer intento de inserciones de NaN. Esto fue contestado por el Felipe de la Nube en la respuesta que he aceptado.
  • (Las respuestas no debe estar contenida en la pregunta) Una opción más simple es asignación directa.
  • Simplemente hacer df['new'] = 0
InformationsquelleAutor yemu | 2014-06-04

2 Comentarios

  1. 18

    La razón por la que este pone NaN en una columna es porque df.index y la Index de su lado derecho objeto son diferentes. @zach muestra la manera correcta de asignar una nueva columna de ceros. En general, pandas intenta hacer como mucho la alineación de los índices como sea posible. Una desventaja es que cuando los índices no están alineados usted obtener NaN dondequiera que no alineados. Jugar con el reindex y align métodos para ganar algo de intuición para la alineación trabaja con objetos que tienen parcialmente, totalmente, y no-alineados-todos alineados a los índices. Por ejemplo, aquí es cómo DataFrame.align() trabaja con parcialmente alineado índices:

    In [7]: from pandas import DataFrame
    
    In [8]: from numpy.random import randint
    
    In [9]: df = DataFrame({'a': randint(3, size=10)})
    
    In [10]:
    
    In [10]: df
    Out[10]:
       a
    0  0
    1  2
    2  0
    3  1
    4  0
    5  0
    6  0
    7  0
    8  0
    9  0
    
    In [11]: s = df.a[:5]
    
    In [12]: dfa, sa = df.align(s, axis=0)
    
    In [13]: dfa
    Out[13]:
       a
    0  0
    1  2
    2  0
    3  1
    4  0
    5  0
    6  0
    7  0
    8  0
    9  0
    
    In [14]: sa
    Out[14]:
    0     0
    1     2
    2     0
    3     1
    4     0
    5   NaN
    6   NaN
    7   NaN
    8   NaN
    9   NaN
    Name: a, dtype: float64
    • La persona que votada abajo de atención a comentar?
    • yo no downvote pero su código carece de comentarios, hace que sea difícil de seguir, junto con la que estás tratando de lograr en el fragmento de código
    • Has leído el texto anterior, el código?
    • Esto en realidad no responder a la pregunta. OP está preguntando acerca de cómo agregar una nueva columna que contiene un valor constante.
    • No estoy de acuerdo que no un la pregunta aquí. Hay «¿Cómo puedo asignar un valor constante a una columna?» así como «Mi intento de hacer esto no funciona en X manera, ¿por qué se comporta de forma inesperada?» Creo que me he dirigido a los dos puntos, el primero haciendo referencia a otra respuesta. Por favor, lee todo del texto en mi respuesta.
  2. 10

    Super Simple: Asignación Directa

    Para en lugar de la modificación, realizar la asignación directa. Esta asignación es transmitido por los pandas para cada fila.

    df = pd.DataFrame('x', index=range(4), columns=list('ABC'))
    df
    
       A  B  C
    0  x  x  x
    1  x  x  x
    2  x  x  x
    3  x  x  x

    df['new'] = 'y'
    # Same as,
    # df.loc[:, 'new'] = 'y'
    df
    
       A  B  C new
    0  x  x  x   y
    1  x  x  x   y
    2  x  x  x   y
    3  x  x  x   y

    La generación de una Copia: DataFrame.assign

    Si usted necesita una copia en su lugar, utilice DataFrame.asignar:

    df.assign(new='y')
    
       A  B  C new
    0  x  x  x   y
    1  x  x  x   y
    2  x  x  x   y
    3  x  x  x   y

    Y, si es necesario asignar varias columnas con el mismo valor, esto es tan simple como,

    c = ['new1', 'new2', ...]
    df.assign(**dict.fromkeys(c, 'y'))
    
       A  B  C new1 new2
    0  x  x  x    y    y
    1  x  x  x    y    y
    2  x  x  x    y    y
    3  x  x  x    y    y

    Múltiples De La Columna De Asignación De

    Por último, si necesita asignar varias columnas con valores diferentes, puede utilizar assign con un diccionario.

    c = {'new1': 'w', 'new2': 'y', 'new3': 'z'}
    df.assign(**c)
    
       A  B  C new1 new2 new3
    0  x  x  x    w    y    z
    1  x  x  x    w    y    z
    2  x  x  x    w    y    z
    3  x  x  x    w    y    z

Dejar respuesta

Please enter your comment!
Please enter your name here