将pandas系列列表转换为嵌套框架

qmelpv7a  于 12个月前  发布在  其他
关注(0)|答案(9)|浏览(150)

我有一系列的清单

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

字符串
我想要一个DataFrame,每列都是一个列表。
from_itemsfrom_recordsDataFrameSeries.to_frame似乎都不起作用。
如何做到这一点?

7qhs6swi

7qhs6swi1#

正如@Hatshepsut在评论中指出的那样,from_itemsdeprecated 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的答案中所使用的那样,然而,它也适用于不同长度的列表):

%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

huus2vyu

huus2vyu2#

如果该系列的长度超高(超过1米),可以用途:

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

字符串

vlf7wbxs

vlf7wbxs3#

尝试:

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

字符串

sgtfey8w

sgtfey8w4#

像这样迭代序列:

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

字符串

6tr1vspr

6tr1vspr5#

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

字符串

qgzx9mmu

qgzx9mmu6#

您可能正在寻找

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

ds97pgxw

ds97pgxw7#

注意接受答案中的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()为我们提供了迄今为止最快的方法:

%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)

f1tvaqid

f1tvaqid8#

一个更好的方法是利用pandas在使用Series.values时输出一个numpy数组的事实。然后你可以使用np.vstack将这个奇怪的集合重新整形为一个记录堆栈,它会自动将所有数据解压缩到一个整洁的n_row x n_numpy形状的numpy数组中。

pd.DataFrame(np.vstack(my_serie.values), index=my_serie.index)

字符串

bz4sfanl

bz4sfanl9#

您真正需要的是 transpose 属性。

pd.DataFrame.from_records(s).T

字符串
这是上面代码生成的输出。“

0  1
0  1  4
1  2  5
2  3  6

相关问题