2017-08-27 143 views
3

我已經列出轉換大熊貓一系列列表到數據幀

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

的系列,我想與每一列數據框的列表。

沒有from_items,from_records,DataFrameSeries.to_frame似乎工作。

如何做到這一點?

回答

6

您可以使用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'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 

最快溶液似乎是@Abdou's answer(對於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

如果你想添加它,@ Abdou的'itertools'解決方案似乎更快。但確實需要額外的庫。在適用的情況下,還可能注意到相同長度的限制? – Hatshepsut

+1

@Hatshepsut:已添加。相同的長度似乎並不需要,對於s = pd.Series([[1,2,3,4],[4,5,6]])也可以正常工作' – Cleb

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 
+0

可能不是最好的選擇在這裏,因爲它似乎相當緩慢(見下面我的計時)。 – Cleb

+0

@Cleb試試這個例子's = pd。系列([[1,2,3,4],[4,5,6]])'我認爲列表的長度不同〜如果長度相同,你的答案更好〜:) – Wen

+1

當然,那麼我的會失敗,但哈特謝普蘇特人似乎還是比較快。我確實認爲所有的列表都有相同的長度,將其添加爲評論,謝謝指出! – Cleb

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 
+0

相當快;應該把這個添加到下面的時間...(upvoted) – Cleb

3

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 
+0

似乎是最快的解決方案(upvoted )。您可能想補充說這是一個Python3解決方案;在Python 2中,它將是'itertools.izip_longest'。 – Cleb

1

如果序列的長度是超高(超過1m),你可以使用:

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