I have a series made of lists
import pandas as pd
s = pd.Series([[1, 2, 3], [4, 5, 6]])
and I want a DataFrame with each column a list.
None of from_items, from_records, DataFrame Series.to_frame seem to work. 
How to do this?
Create pandas DataFrame from Multiple ListsUse column param and index param to provide column & row labels respectively to the DataFrame. Alternatively, you can also add column names to DataFrame and set the index using pandas. DataFrame. set_index() method.
As @Hatshepsut pointed out in the comments, from_items is deprecated as of version 0.23. The link suggests to use from_dict instead, so the old answer can be modified to:
pd.DataFrame.from_dict(dict(zip(s.index, s.values)))
--------------------------------------------------OLD ANSWER-------------------------------------------------------------
You can use from_items like this (assuming that your lists are of the same length):
pd.DataFrame.from_items(zip(s.index, s.values))
   0  1
0  1  4
1  2  5
2  3  6
or
pd.DataFrame.from_items(zip(s.index, s.values)).T
   0  1  2
0  1  2  3
1  4  5  6
depending on your desired output.
This can be much faster than using an apply (as used in @Wen's answer which, however, does also work for lists of different length):
%timeit pd.DataFrame.from_items(zip(s.index, s.values))
1000 loops, best of 3: 669 µs per loop
%timeit s.apply(lambda x:pd.Series(x)).T
1000 loops, best of 3: 1.37 ms per loop
and
%timeit pd.DataFrame.from_items(zip(s.index, s.values)).T
1000 loops, best of 3: 919 µs per loop
%timeit s.apply(lambda x:pd.Series(x))
1000 loops, best of 3: 1.26 ms per loop
Also @Hatshepsut's answer is quite fast (also works for lists of different length):
%timeit pd.DataFrame(item for item in s)
1000 loops, best of 3: 636 µs per loop
and
%timeit pd.DataFrame(item for item in s).T
1000 loops, best of 3: 884 µs per loop
Fastest solution seems to be @Abdou's answer (tested for Python 2; also works for lists of different length; use itertools.zip_longest in Python 3.6+):
%timeit pd.DataFrame.from_records(izip_longest(*s.values))
1000 loops, best of 3: 529 µs per loop
An additional option:
pd.DataFrame(dict(zip(s.index, s.values)))
   0  1
0  1  4
1  2  5
2  3  6
                        If the length of the series is super high (more than 1m), you can use:
s = pd.Series([[1, 2, 3], [4, 5, 6]])
pd.DataFrame(s.tolist())
                        Iterate over the series like this:
series = pd.Series([[1, 2, 3], [4, 5, 6]])
pd.DataFrame(item for item in series)
   0  1  2
0  1  2  3
1  4  5  6
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With