我有一个由列表组成的系列
import pandas as pd
s = pd.Series([[1, 2, 3], [4, 5, 6]])
我想要一个数据框,其中每一列都是一个列表。
使用 from_items
、from_records
、DataFrame
或 Series.to_frame
都似乎不起作用。
如何实现?
正如@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'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的回答也非常快速(同样适用于不同长度的列表):
%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
最快的解决方案似乎是@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
如果序列的长度非常长(超过1m),您可以使用:
s = pd.Series([[1, 2, 3], [4, 5, 6]])
pd.DataFrame(s.tolist())
尝试:
import numpy as np, pandas as pd
s = pd.Series([[1, 2, 3], [4, 5, 6]])
pd.DataFrame(np.vstack(s))
按照以下方式遍历系列:
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
itertools.izip_longest
。 - Cleb您可能正在寻找
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
s = pd.Series([[1,2, 3,4], [4, 5,6]])
我考虑到列表长度不同的情况,如果它们长度相同,那么你的答案就更好了~ :) - BENY注意:接受的答案中from_items()
方法在最新版本的Pandas中已被废弃,应该使用from_dict()
方法。如下所示:
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()
方法是目前最快速的方法:%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)
from_records
对这个答案有什么影响吗? - baxxpd.DataFrame(np.vstack(my_serie.values), index=my_serie.index)
itertools
解决方案似乎更快。但是需要使用额外的库。还可以注意到相同长度的限制是否适用? - Hatshepsuts = pd.Series([[1,2, 3,4], [4, 5,6]])
也可以正常工作。 - Clebs.apply(lambda x:pd.Series(x))
,而不是直接写s.apply(pd.Series)
呢? :) - Unknown artistfrom_items
现在已被弃用。from_items
是指从项目中创建DataFrame的方法。详细信息请参见链接:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.from_items.html - Hatshepsutpd.DataFrame(s.to_dict())
。 - Arnon Erez