2017-08-27 3 views
3

Ich habe eine Reihe von Listen gemachtConvert Pandas Reihe von Listen zu Datenrahmen

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

und ich möchte einen Datenrahmen mit jeder Spalte einer Liste.

Keine from_items, from_records, DataFrameSeries.to_frame zu funktionieren scheint.

Wie geht das?

Antwort

6

Sie from_items wie diese verwenden können (vorausgesetzt, dass Ihre Listen sind von die gleiche Länge):

pd.DataFrame.from_items(zip(s.index, s.values)) 

    0 1 
0 1 4 
1 2 5 
2 3 6 

oder

pd.DataFrame.from_items(zip(s.index, s.values)).T 

    0 1 2 
0 1 2 3 
1 4 5 6 

abhängig von der gewünschten Ausgabe.

Dies kann viel schneller sein als eine apply (wie in @Wen's answer verwendet, die jedoch auch für Listen unterschiedlicher Länge funktioniert):

%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 

und

%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 

Auch @Hatshepsut's answer ist ziemlich schnell (funktioniert auch für Listen unterschiedlicher Länge):

%timeit pd.DataFrame(item for item in s) 
1000 loops, best of 3: 636 µs per loop 

und

%timeit pd.DataFrame(item for item in s).T 
1000 loops, best of 3: 884 µs per loop 

schnellste Lösung scheint für Python 2 @Abdou's answer (getestet werden; funktioniert auch für Listen unterschiedlicher Länge; verwenden itertools.zip_longest in Python 3.6 oder höher):

%timeit pd.DataFrame.from_records(izip_longest(*s.values)) 
1000 loops, best of 3: 529 µs per loop 

Eine zusätzliche Option:

pd.DataFrame(dict(zip(s.index, s.values))) 

    0 1 
0 1 4 
1 2 5 
2 3 6 
+1

Falls Sie es hinzufügen möchten, scheint @ Abdou 'itertools' Lösung noch schneller zu sein. aber erfordert diese zusätzliche Bibliothek. Könnte man auch die gleiche Beschränkung beachten, wo das gilt? – Hatshepsut

+1

@Hatshepsut: Hinzugefügt. Gleiche Länge scheint nicht erforderlich zu sein, funktioniert auch gut für 's = pd.Series ([[1,2, 3,4], [4, 5,6]])' – Cleb

1

Sie können für

s.apply(lambda x:pd.Series(x)) 
    0 1 2 
0 1 2 3 
1 4 5 6 

Oder

s.apply(lambda x:pd.Series(x)).T 

Out[133]: 
    0 1 
0 1 4 
1 2 5 
2 3 6 
+0

Vielleicht nicht die beste Wahl hier, da es eher langsam scheint (siehe meine Zeiten unten). – Cleb

+0

@Cleb versuchen Sie dieses Beispiel 's = pd.Serie ([[1,2, 3,4], [4, 5,6]]) 'Ich betrachte die unterschiedliche Länge der Liste ~ Wenn es die gleiche Länge hat, ist deine Antwort besser ~ :) – Wen

+1

Sicher, dann meins wird scheitern, aber Hatschepsut scheint immer noch schneller. Ich nahm tatsächlich an, dass alle Listen die gleiche Länge haben, füge das als Kommentar hinzu, danke fürs Hinzeigen! – Cleb

1

Iterate über die Serie wie folgt aussehen:

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

Ziemlich schnell; sollte dies zu den Zeiten unten hinzufügen ... (upvoted) – Cleb

3

pd.DataFrame.from_records auch itertools.zip_longest arbeiten verwenden, sollten:

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

Scheint die schnellste Lösung zu sein (upvoted). Vielleicht möchten Sie hinzufügen, dass dies eine Python3-Lösung ist; In Python 2 wäre es "itertools.izip_longest". – Cleb

1

Wenn die Länge der Serie Super hoch ist (mehr als 1m), können Sie verwenden:

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