我有一个由列表组成的系列
import pandas as pd
s = pd.Series([[1, 2, 3], [4, 5, 6]])
我想要一个 DataFrame,每列都有一个列表。
from_items
、from_records
、DataFrame
Series.to_frame
似乎都不起作用。
如何做到这一点?
最佳答案
正如@Hatshepsut 在评论中指出的那样,from_items
是 deprecated as of version 0.23 .该链接建议改用 from_dict
,因此可以将旧答案修改为:
pd.DataFrame.from_dict(dict(zip(s.index, s.values)))
-------------------------------------------- ---老答案-------------------------------------------- ------------------
您可以像这样使用 from_items
(假设您的列表长度相同):
pd.DataFrame.from_items(zip(s.index, s.values))
0 1
0 1 4
1 2 5
2 3 6
或
pd.DataFrame.from_items(zip(s.index, s.values)).T
0 1 2
0 1 2 3
1 4 5 6
取决于您想要的输出。
这比使用 apply
(在 @Wen's answer 中使用,然而,它也适用于不同长度的列表)要快得多:
%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
和
%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
还有 @Hatshepsut's answer非常快(也适用于不同长度的列表):
%timeit pd.DataFrame(item for item in s)
1000 loops, best of 3: 636 µs per loop
和
%timeit pd.DataFrame(item for item in s).T
1000 loops, best of 3: 884 µs per loop
最快的解决方案似乎是 @Abdou's answer (针对 Python 2 进行了测试;也适用于不同长度的列表;在 Python 3.6+ 中使用 itertools.zip_longest
):
%timeit pd.DataFrame.from_records(izip_longest(*s.values))
1000 loops, best of 3: 529 µs per loop
附加选项:
pd.DataFrame(dict(zip(s.index, s.values)))
0 1
0 1 4
1 2 5
2 3 6
关于python - 将 Pandas 系列列表转换为数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45901018/