Convert dataframe of list in columns to rows

Andrés Bustamante :

I have a pandas DataFrame of this type

col1  col2           col3
 1   [blue]         [in,out]
 2   [green, green] [in]
 3   [green]        [in]

and I need convert it to a dataframe that keep the first column and distribute all the other values in columns as rows:

col1 value
1    blue
1    in
1    out
2    green
2    green
2    in
3    green
3    in
jezrael :

Use DataFrame.stack with Series.explode for convert lists, last some data cleaning with DataFrame.reset_index:

df1 = (df.set_index('col1')
         .stack()
         .explode()
         .reset_index(level=1, drop=True)
         .reset_index(name='value'))

Alternative with DataFrame.melt and DataFrame.explode:

df1 = (df.melt('col1')
         .explode('value')
         .sort_values('col1')[['col1','value']]
         .reset_index(drop=True)
)

print (df1)
   col1  value
0     1   blue
1     1     in
2     1    out
3     2  green
4     2  green
5     2     in
6     3  green
7     3     in

Or list comprehension solution:

L = [(k, x) for k, v in df.set_index('col1').to_dict('index').items() 
            for k1, v1 in v.items() 
            for x in v1]

df1 = pd.DataFrame(L, columns=['col1','value'])
print (df1)
   col1  value
0     1   blue
1     1     in
2     1    out
3     2  green
4     2  green
5     2     in
6     3  green
7     3     in

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=279151&siteId=1