Pandas DataFrame astack múltiples valores de columna en una sola columna

Suponiendo el siguiente DataFrame:

key.0 key.1 key.2 topic 1 abc def ghi 8 2 xab xcd xef 9 

¿Cómo puedo combinar los valores de todas las columnas clave. * En una sola columna ‘clave’, que se asocia con el valor del tema correspondiente a las columnas clave. *? Este es el resultado que quiero:

  topic key 1 8 abc 2 8 def 3 8 ghi 4 9 xab 5 9 xcd 6 9 xef 

Tenga en cuenta que el número de columnas key.N es variable en algunos N. externos

Puede fundir su dataframe:

 >>> keys = [c for c in df if c.startswith('key.')] >>> pd.melt(df, id_vars='topic', value_vars=keys, value_name='key') topic variable key 0 8 key.0 abc 1 9 key.0 xab 2 8 key.1 def 3 9 key.1 xcd 4 8 key.2 ghi 5 9 key.2 xef 

También le da la fuente de la clave.


Desde v0.20 , melt es una función de primera clase de la clase pd.DataFrame :

 >>> df.melt('topic', value_name='key').drop('variable', 1) topic key 0 8 abc 1 9 xab 2 8 def 3 9 xcd 4 8 ghi 5 9 xef 

Bien, porque una de las respuestas actuales es la marca como duplicado de esta pregunta, responderé aquí.

Utilizando wide_to_long

 pd.wide_to_long(df, ['key'], 'topic', 'age').reset_index().drop('age',1) Out[123]: topic key 0 8 abc 1 9 xab 2 8 def 3 9 xcd 4 8 ghi 5 9 xef 

Después de probar varias formas, encuentro que lo siguiente es más o menos intuitivo, siempre que se comprenda la magia de la stack :

 # keep topic as index, stack other columns 'against' it stacked = df.set_index('topic').stack() # set the name of the new series created df = stacked.reset_index(name='key') # drop the 'source' level (key.*) df.drop('level_1', axis=1, inplace=True) 

El dataframe resultante es el requerido:

  topic key 0 8 abc 1 8 def 2 8 ghi 3 9 xab 4 9 xcd 5 9 xef 

Es posible que desee imprimir los resultados intermedios para comprender el proceso en su totalidad. Si no le importa tener más columnas de las necesarias, los pasos clave son set_index('topic') , stack() y reset_index(name='key') .