Combine los valores de la columna del dataframe de Pandas en una nueva columna

Estoy trabajando con Pandas y tengo un dataframe donde podemos rellenar uno de tres valores:

ID_1 ID_2 ID_3 abc NaN NaN NaN def NaN NaN NaN ghi NaN NaN jkl NaN mno NaN pqr NaN NaN 

Y mi objective es combinar estas tres columnas en una nueva columna en mi dataframe:

 ID_1 ID_2 ID_3 Combined_ID abc NaN NaN abc NaN def NaN def NaN NaN ghi ghi NaN NaN jkl jkl NaN mno NaN mno pqr NaN NaN pqr 

Lo ideal sería encontrar el valor no nulo que existe en las columnas 1 a 3, pero también podría concatenar, ya que solo deberíamos tener uno de los tres para cada fila. Gracias.

 df_note = pd.read_csv("NoteIds.csv") df_note['Combined_ID'] = # ID_1 + ID_2 + ID_3 

Puede usar la propiedad que la sum concatenará los valores de la cadena, por lo que puede llamar a fillna y pasar una cadena vacía y la sum la llamada y pasar el axis=1 param axis=1 para sumr por filas

 In [26]: df['Combined_ID'] = df.fillna('').sum(axis=1) df Out[26]: ID_1 ID_2 ID_3 Combined_ID 0 abc NaN NaN abc 1 NaN def NaN def 2 NaN NaN ghi ghi 3 NaN NaN jkl jkl 4 NaN mno NaN mno 5 pqr NaN NaN pqr 

Si solo te interesan esas 3 columnas, solo tienes que seleccionarlas:

 In [39]: df['Combined_ID'] = df[['ID_1','ID_2','ID_3']].fillna('').sum(axis=1) df Out[39]: ID_1 ID_2 ID_3 Combined_ID 0 abc NaN NaN abc 1 NaN def NaN def 2 NaN NaN ghi ghi 3 NaN NaN jkl jkl 4 NaN mno NaN mno 5 pqr NaN NaN pqr 

Supongamos que puede haber más de un valor no NaN por fila. Aún así esto debería funcionar.

 In [43]: df['Combined_ID'] = df.apply( lambda x : ''.join([e for e in x if isinstance(e, basestring)]), axis=1) 

Para cada fila, extraiga los elementos de cadena y únalos.

 In [44]: df Out[44]: ID_1 ID_2 ID_3 Combined_ID 0 abc NaN NaN abc 1 NaN def NaN def 2 NaN NaN ghi ghi 3 NaN NaN jkl jkl 4 NaN mno NaN mno 5 pqr NaN NaN pqr 

Me gustó la respuesta de @EdChum y parece más legible.

Curiosamente, el fillna('').sum(axis=1) es caro para este dato más pequeño.

 In [45]: %timeit df.fillna('').sum(axis=1) 1000 loops, best of 3: 808 µs per loop In [46]: %timeit df.apply(lambda x : ''.join([e for e in x if isinstance(e, basestring)]), axis=1) 1000 loops, best of 3: 285 µs per loop 

Sólo para las columnas ['ID_1','ID_2','ID_3']

 df[['ID_1','ID_2','ID_3']].apply(lambda_function) 

De otra manera:

 df['Combined_ID'] = df.ID_1.fillna('') + df.ID_2.fillna('') + df.ID_3.fillna('') 

Salida:

  ID_1 ID_2 ID_3 Combined_ID 0 abc NaN NaN abc 1 NaN def NaN def 2 NaN NaN ghi ghi 3 NaN NaN jkl jkl 4 NaN mno NaN mno 5 pqr NaN NaN pqr