cómo reunir la columna DataFrame en pares de valores clave como fila en Python

Estoy tratando de reunir una columna de Pandas DataFrame en un par de valores clave y listarla como una fila en python. Si tomamos el siguiente DataFrame como ejemplo, quiero ir desde aquí:

import pandas as pd from collections import OrderedDict df = pd.DataFrame({'value_2016': [200], 'value_2017': [300], 'value_2018': [float('NaN')]}) print(df) value_2016 value_2017 value_2018 0 200 300 NaN 

a:

 df_result = pd.DataFrame(OrderedDict({'year': [2016, 2017], 'value': [200, 300]})) print(df_result) year value 0 2016 200 1 2017 300 

Si estás familiarizado con R, el equivalente sería algo como esto:

 require("plyr"); require("dplyr"); require(tidyr) df % gather(year, value, value_2016:value_2018) %>% mutate(year = gsub(x = .$year, replacement = "", "value_")) %>% na.exclude year value 1 2016 200 2 2017 300 

¡Cualquier ayuda sería muy buena!

Puede crear MultiIndex por split y luego remodelar por stack :

 df.columns = df.columns.str.split('_', expand=True) df = df.stack().reset_index(level=0, drop=True).rename_axis('year').reset_index() #if necessary convert float to int df.value = df.value.astype(int) print (df) year value 0 2016 200 1 2017 300 

Si quiere usar el constructor get_level_values use get_level_values :

 df.columns = df.columns.str.split('_', expand=True) df = df.stack() df_result = pd.DataFrame(OrderedDict({'year': df.index.get_level_values(1), 'value': df['value'].astype(int).values})) print(df_result) year value 0 2016 200 1 2017 300 

Podrías usar rename , stack y reset_index

 In [4912]: (df.rename(columns=lambda x: x.split('_')[-1]).stack() .reset_index(level=0, drop=True) .rename_axis('year') .reset_index(name='value')) Out[4912]: year value 0 2016 200.0 1 2017 300.0