Estoy tratando de crear una función que se recorre a través de un pandas dataframe fila por fila. Quiero crear una nueva columna en función de los valores de fila de las otras columnas. Mi original dataframe podría tener este aspecto:

df:

   A   B
0  1   2
1  3   4
2  2   2

Ahora quiero crear una nueva columna rellena con los valores de la fila de la Columna a Columna B en cada posición de índice, de modo que el resultado se parece a esto:

 df:

       A   B   A-B
    0  1   2   -1
    1  3   4   -1
    2  2   2    0

la solución que me funciona, pero solo cuando yo NO lo uso en una función:

for index, row in df.iterrows():
        print index
        df['A-B']=df['A']-df['B']

Esto me da el resultado deseado, pero cuando trato de usarlo como una función, me sale un error.

def test(x):
    for index, row in df.iterrows():
        print index
        df['A-B']=df['A']-df['B']
    return df
df.apply(test)

ValueError: cannot copy sequence with size 4 to array axis with dimension 3

¿Qué estoy haciendo mal aquí y ¿cómo puedo conseguir que funcione?

  • ¿necesita sólo restar la columna de las otras, o es sólo un ejemplo sencillo?
  • Yo realmente sólo necesitamos una nueva columna que contiene los resultados de la columna menos la columna B

2 Comentarios

  1. 4

    Es porque aplicar método funciona para la columna por defecto, cambie axis a 1 si quieres a través de las filas:

    eje : {0 o ‘index’, 1 o «columnas»}, por defecto 0

    • 0 o ‘índice’: aplicar la función a cada columna
    • 1 o «columnas»: aplicar la función a cada fila
    df.apply(test, axis=1)

    EDITAR

    Pensé que usted necesita para hacer algo complejo manupulation con cada fila. Si usted necesita sólo restan las columnas de cada uno de los otros:

    df['A-B'] = df.A - df.B
    • Eso tiene sentido, gracias. Me sigue apareciendo el mismo error, aunque parece que funciona de todos modos…
    • para mí, funciona en ambos sentidos con axis=1 un axis=0 lo pandas versión estás usando?
    • Estoy utilizando la versión 0.17.0
    • podría este enfoque se utiliza para las constantes así? por ejemplo my_df['Division by constant c'] = my_df.column_A / 4 ?
    • sí, que va a trabajar. Usted podría intentar.
  2. 2

    Como se indica por Anton debe ejecutar el aplicar función con axis=1 parámetro. Sin embargo no es necesario, a continuación, recorrer las filas como lo hizo en la prueba de la función, ya que
    el aplicar documentación menciona:

    Objetos pasan a las funciones son una Serie de objetos

    Por lo que podría simplificar la función:

    def test(x):
        x['A-B']=x['A']-x['B']
        return x

    y, a continuación, ejecute:

    df.apply(test,axis=1)

    Nota de que, de hecho, el nombre del parámetro de prueba x, mientras que el no uso de x en la función test a todos.

    Finalmente debo comentar que se puede hacer de la columna sabio operaciones con pindas (es decir, sin el bucle for) hacer simplemente esto:

    df['A-B']=df['A']-df['B']

    Véase también:

    • Gracias, no sabía que la creación de ne columna nueva era posible sin la for-loop!
    • De hecho, esta es una pregunta nueva. Pero, ya le había pedido antes de: stackoverflow.com/questions/18472634/…

Dejar respuesta

Please enter your comment!
Please enter your name here