将熊猫系列列表转换为数据框

新手上路,请多包涵

我有一系列清单

import pandas as pd
s = pd.Series([[1, 2, 3], [4, 5, 6]])

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

from_items , from_records , DataFrame Series.to_frame 似乎都不起作用

这该怎么做?

原文由 Hatshepsut 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 632
2 个回答

正如@Hatshepsut 在评论中指出的那样, from_items 从版本 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 的回答 中所用,但是,它也适用于不同长度的列表):

 %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 的回答 非常快(也适用于不同长度的列表):

 %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 的回答(针对 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

原文由 Cleb 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 s = pd.Series([[1, 2, 3], [4, 5, 6]])
pd.DataFrame(s.tolist())

原文由 Z.Webber 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题