将pandas系列列表转换为dataframe

时间:2017-08-27 01:36:17

标签: python pandas dataframe

我有一个由列表组成的系列

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

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

from_itemsfrom_recordsDataFrame Series.to_frame似乎无效。

怎么做?

7 个答案:

答案 0 :(得分:12)

您可以像这样使用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中使用的@Hatshepsut'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

同样@Abdou'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

最快的解决方案似乎是{{3}}(针对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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

您可能正在寻找

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

答案 3 :(得分:1)

迭代这个系列:

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

注意,已接受答案中的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)

答案 6 :(得分:1)

尝试:

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