[英]Convert pandas series of lists to dataframe
我有一系列的列表
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
從版本 0.23 from_items
已棄用。 該鏈接建議改用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
像這樣迭代系列:
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
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
如果系列的長度超高(超過1m),可以使用:
s = pd.Series([[1, 2, 3], [4, 5, 6]])
pd.DataFrame(s.tolist())
您可能正在尋找
s.apply(lambda x:pd.Series(x))
0 1 2
0 1 2 3
1 4 5 6
或者
s.apply(lambda x:pd.Series(x)).T
Out[133]:
0 1
0 1 4
1 2 5
2 3 6
請注意,已接受答案中的from_items()
方法在最新的 Pandas 中已棄用,而應from_dict()
方法。 方法如下:
pd.DataFrame.from_dict(dict(zip(s.index, s.values)))
## OR
pd.DataFrame.from_dict(dict(zip(s.index, s.values))).T
還要注意, from_dict()
,使用from_dict()
為我們提供了最快的方法:
%timeit pd.DataFrame.from_dict(dict(zip(s.index, s.values)))
376 µs ± 14.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
## OR
%timeit pd.DataFrame.from_dict(dict(zip(s.index, s.values))).T
487 µs ± 3.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
嘗試:
import numpy as np, pandas as pd
s = pd.Series([[1, 2, 3], [4, 5, 6]])
pd.DataFrame(np.vstack(s))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.