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
, DataFrame
Series.to_frame
scheint zu funktionieren.
Wie macht man das?
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
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
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)
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())
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
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