簡體   English   中英

將熊貓系列列表轉換為數據框

[英]Convert pandas series of lists to dataframe

我有一系列的列表

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

我想要一個每列一個列表的 DataFrame。

from_itemsfrom_recordsDataFrame 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM