Tengo 2 dataframes, uno de los cuales tiene información adicional para algunos (pero no todos) de las filas de la otra.

names = df({'names':['bob','frank','james','tim','ricardo','mike','mark','joan','joe'],
            'position':['dev','dev','dev','sys','sys','sys','sup','sup','sup']})
info = df({'names':['joe','mark','tim','frank'],
           'classification':['thief','thief','good','thief']})

Me gustaría aprovechar la clasificación de la columna de la info dataframe arriba y agregar a la names dataframe arriba. Sin embargo, cuando hago combined = pd.merge(names, info) el resultado dataframe está a sólo 4 filas de largo. Todas las filas que no tienen información complementaria se cayó.

Lo ideal sería tener los valores en las columnas que faltan conjunto desconocido. Lo que resulta en un dataframe donde algunas personas son miembros de cuadrilla, algunos son buenos, y el resto son desconocidos.

EDITAR:
Una de las primeras respuestas que he recibido sugirió el uso de combinación de outter que parece hacer algunas cosas extrañas. Aquí es un ejemplo de código:

names = df({'names':['bob','frank','bob','bob','bob''james','tim','ricardo','mike','mark','joan','joe'],
            'position':['dev','dev','dev','dev','dev','dev''sys','sys','sys','sup','sup','sup']})
info = df({'names':['joe','mark','tim','frank','joe','bill'],
           'classification':['thief','thief','good','thief','good','thief']})
what = pd.merge(names, info, how="outer")
what.fillna("unknown")

Lo extraño es que en la salida me voy a conseguir una fila en la que el nombre resultante es «bobjames» y otro donde la posición es «devsys». Finalmente, aunque la factura no aparece en los nombres de dataframe se muestra en el resultado dataframe. Así que realmente necesitan una manera de decir la búsqueda de un valor en este otro dataframe y si encuentras algo tachuela en esas columnas.

3 Comentarios

  1. 15

    En caso de que usted todavía está buscando una respuesta para esto:

    El «extraño» cosas que usted describe son debido a algunos pequeños errores en su código. Por ejemplo, la primera (aparición de «bobjames» y «devsys») es debido al hecho de que usted no tiene una coma entre los dos valores en su origen dataframes. Y la segunda es porque los pandas no se preocupa por el nombre de su dataframe pero se preocupa por el nombre de las columnas cuando la fusión (tiene un dataframe llamados «nombres», sino también, las columnas se llama «nombres»). De lo contrario, parece que la combinación está haciendo exactamente lo que está buscando:

    import pandas as pd
    names = pd.DataFrame({'names':['bob','frank','bob','bob','bob', 'james','tim','ricardo','mike','mark','joan','joe'], 
                          'position':['dev','dev','dev','dev','dev','dev', 'sys','sys','sys','sup','sup','sup']})
    
    info = pd.DataFrame({'names':['joe','mark','tim','frank','joe','bill'],
                         'classification':['thief','thief','good','thief','good','thief']})
    what = pd.merge(names, info, how="outer")
    what.fillna('unknown', inplace=True)

    que se traducirá en:

          names position classification
    0       bob      dev        unknown
    1       bob      dev        unknown
    2       bob      dev        unknown
    3       bob      dev        unknown
    4     frank      dev          thief
    5     james      dev        unknown
    6       tim      sys           good
    7   ricardo      sys        unknown
    8      mike      sys        unknown
    9      mark      sup          thief
    10     joan      sup        unknown
    11      joe      sup          thief
    12      joe      sup           good
    13     bill  unknown          thief
  2. 14

    Creo desea realizar una outer merge:

    In [60]:
    
    pd.merge(names, info, how='outer')
    Out[60]:
         names position classification
    0      bob      dev            NaN
    1    frank      dev          thief
    2    james      dev            NaN
    3      tim      sys           good
    4  ricardo      sys            NaN
    5     mike      sys            NaN
    6     mark      sup          thief
    7     joan      sup            NaN
    8      joe      sup          thief

    Hay sección donde se muestra el tipo de las uniones puede realizar: http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging

    • Gracias por eso, pero todavía estoy teniendo algunos problemas para conseguir lo que quiero. He actualizado mi pregunta con más contexto.
  3. 0

    Pensar en ello como un join de SQL operación. Usted necesita un left-outer join[1].

    names = pd.DataFrame({'names':['bob','frank','james','tim','ricardo','mike','mark','joan','joe'],'position':['dev','dev','dev','sys','sys','sys','sup','sup','sup']})

    info = pd.DataFrame({'names':['joe','mark','tim','frank'],'classification':['thief','thief','good','thief']})

    Ya que hay names para el que no hay classification, un left-outer unirse para hacer el trabajo.

    a = pd.merge(names, info, how='left', on='names')

    El resultado es …

    >>> a
         names position classification
    0      bob      dev            NaN
    1    frank      dev          thief
    2    james      dev            NaN
    3      tim      sys           good
    4  ricardo      sys            NaN
    5     mike      sys            NaN
    6     mark      sup          thief
    7     joan      sup            NaN
    8      joe      sup          thief

    … lo cual está bien. Todos los NaN resultados están bien, si se mira tanto las tablas.

    Saludos!

    [1] – http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging

Dejar respuesta

Please enter your comment!
Please enter your name here