将pandas系列列表转换为dataframe

Hat*_*sut 8 python dataframe pandas

我有一系列的清单

import pandas as pd
s = pd.Series([[1, 2, 3], [4, 5, 6]])
Run Code Online (Sandbox Code Playgroud)

我想要一个DataFrame,每列都有一个列表.

没有from_items,from_records,DataFrame Series.to_frame似乎工作.

这该怎么做?

Cle*_*leb 14

您可以这样使用from_items(假设您的列表长度相同):

pd.DataFrame.from_items(zip(s.index, s.values))

   0  1
0  1  4
1  2  5
2  3  6
Run Code Online (Sandbox Code Playgroud)

要么

pd.DataFrame.from_items(zip(s.index, s.values)).T

   0  1  2
0  1  2  3
1  4  5  6
Run Code Online (Sandbox Code Playgroud)

取决于您所需的输出.

这可能比使用一个快得多apply(在@Wen的答案中使用,但是,它也适用于不同长度的列表):

%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
Run Code Online (Sandbox Code Playgroud)

%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
Run Code Online (Sandbox Code Playgroud)

另外@Hatshepsut的答案非常快(也适用于不同长度的列表):

%timeit pd.DataFrame(item for item in s)
1000 loops, best of 3: 636 µs per loop
Run Code Online (Sandbox Code Playgroud)

%timeit pd.DataFrame(item for item in s).T
1000 loops, best of 3: 884 µs per loop
Run Code Online (Sandbox Code Playgroud)

最快的解决方案似乎是@Abdou的答案(针对Python 2测试;也适用于不同长度的列表; itertools.zip_longest在Python 3.6+中使用):

%timeit pd.DataFrame.from_records(izip_longest(*s.values))
1000 loops, best of 3: 529 µs per loop
Run Code Online (Sandbox Code Playgroud)

另外一个选择:

pd.DataFrame(dict(zip(s.index, s.values)))

   0  1
0  1  4
1  2  5
2  3  6
Run Code Online (Sandbox Code Playgroud)

  • `from_items` [现已弃用](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.from_items.html) (3认同)
  • 如果您想添加它,@Abdou 的 `itertools` 解决方案似乎更快。但确实需要额外的库。可能还会注意到适用的相同长度限制吗? (2认同)

Eva*_*ica 12

尝试:

import numpy as np, pandas as pd
s = pd.Series([[1, 2, 3], [4, 5, 6]])
pd.DataFrame(np.vstack(s))
Run Code Online (Sandbox Code Playgroud)


Hat*_*sut 8

像这样迭代系列:

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
Run Code Online (Sandbox Code Playgroud)


小智 8

如果系列的长度超高(超过1m),可以使用:

s = pd.Series([[1, 2, 3], [4, 5, 6]])
pd.DataFrame(s.tolist())
Run Code Online (Sandbox Code Playgroud)


Abd*_*dou 5

pd.DataFrame.from_records应该也可以使用itertools.zip_longest

from itertools import zip_longest

pd.DataFrame.from_records(zip_longest(*s.values))

#    0  1
# 0  1  4
# 1  2  5
# 2  3  6
Run Code Online (Sandbox Code Playgroud)