wake-up-neo.net

Konvertieren Sie Pandas-Reihen von Listen in Datenrahmen

Ich habe eine Reihe von Listen

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

und ich möchte einen DataFrame mit jeder Spalte eine Liste. 

Nichts von from_items, from_records, DataFrameSeries.to_frame scheint zu funktionieren. 

Wie macht man das?

6
Hatshepsut

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

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 Ihrer gewünschten Ausgabe.

Dies kann viel schneller sein als die Verwendung einer apply (wie in @ Wens Antwort 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 @ Hatschepsuts Antwort 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

Die schnellste Lösung scheint die @ Abdous Antwort zu sein (getestet für Python 2; funktioniert auch für Listen unterschiedlicher Länge; verwenden Sie itertools.Zip_longest in Python 3.6+):

%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
12
Cleb

pd.DataFrame.from_records sollte auch mit itertools.Zip_longest funktionieren:

from itertools import Zip_longest

pd.DataFrame.from_records(Zip_longest(*s.values))

#    0  1
# 0  1  4
# 1  2  5
# 2  3  6
4
Abdou

Hinweis dass die Methode from_items() in der akzeptierten Antwort veraltet in der neuesten Pandas und from_dict() ist Methode sollte stattdessen verwendet werden. Hier ist, wie:

pd.DataFrame.from_dict(dict(Zip(s.index, s.values)))

## OR  

pd.DataFrame.from_dict(dict(Zip(s.index, s.values))).T

Beachten Sie auch, dass die Verwendung von from_dict() uns bisher den schnellsten -Ansatz bietet:

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

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

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

Sie können suchen 

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
1
Wen-Ben

Iteriere über die Serie wie folgt:

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
1
Hatshepsut