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')
.