Another solution is to use the result_type='expand' argument of the result_type='expand' function, available since version 0.23. Answering the @splinter question , this method can be generalized - see below:
import pandas as pd from numpy import arange df = pd.DataFrame( {'column1' : [['a','b','c'],['d','e','f'],['g','h','i']], 'column2': [1,2,3]} ) pd.melt( df.join( df.apply(lambda row: row['column1'], axis=1, result_type='expand') ), value_vars=arange(df['column1'].shape[0]), value_name='column1', var_name='column2')[['column1','column2']]
UPDATE (for Jwely's comment): if you have lists of different lengths, you can do the following:
df = pd.DataFrame( {'column1' : [['a','b','c'],['d','f'],['g','h','i']], 'column2': [1,2,3]} ) longest = max(df['column1'].apply(lambda x: len(x))) pd.melt( df.join( df.apply(lambda row: row['column1'] if len(row['column1']) >= longest else row['column1'] + [None] * (longest - len(row['column1'])), axis=1, result_type='expand') ), value_vars=arange(df['column1'].shape[0]), value_name='column1', var_name='column2').query("column1 == column1")[['column1','column2']]