2016-08-09 16 views
5

ich eine 2D Numpy Array haben, Ich mag würde in einer Pandas Serie setzen (kein Datenrahmen):Setzen Sie ein 2D-Array in eine Pandas Serie

>>> import pandas as pd 
>>> import numpy as np 
>>> a = np.zeros((5, 2)) 
>>> a 
array([[ 0., 0.], 
     [ 0., 0.], 
     [ 0., 0.], 
     [ 0., 0.], 
     [ 0., 0.]]) 

Aber das wirft einen Fehler:

>>> s = pd.Series(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/miniconda/envs/pyspark/lib/python3.4/site-packages/pandas/core/series.py", line 227, in __init__ 
    raise_cast_failure=True) 
    File "/miniconda/envs/pyspark/lib/python3.4/site-packages/pandas/core/series.py", line 2920, in _sanitize_array 
    raise Exception('Data must be 1-dimensional') 
Exception: Data must be 1-dimensional 

Es ist möglich, mit einem Hack:

>>> s = pd.Series(map(lambda x:[x], a)).apply(lambda x:x[0]) 
>>> s 
0 [0.0, 0.0] 
1 [0.0, 0.0] 
2 [0.0, 0.0] 
3 [0.0, 0.0] 
4 [0.0, 0.0] 

gibt es einen besseren Weg?

+0

standardmäßig Pandas die Form der bekommt np array und weist DataFrame entsprechend zu. Also musst du die Form deines np-Arrays täuschen ... Was du "hackst", wenn auch nur eine Zeile nach der anderen. – Kartik

+0

Gibt es Überlegungen, wie Sie jede Zeile in einer Liste mithilfe einer Matrixoperation umbrechen? – zemekeneng

+2

Nur aus Neugier, warum willst du das? –

Antwort

4

Nun können Sie die numpy.ndarray.tolist Funktion, wie so verwenden:

>>> a = np.zeros((5,2)) 
>>> a 
array([[ 0., 0.], 
     [ 0., 0.], 
     [ 0., 0.], 
     [ 0., 0.], 
     [ 0., 0.]]) 
>>> a.tolist() 
[[0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0]] 
>>> pd.Series(a.tolist()) 
0 [0.0, 0.0] 
1 [0.0, 0.0] 
2 [0.0, 0.0] 
3 [0.0, 0.0] 
4 [0.0, 0.0] 
dtype: object 

EDIT:

Ein schneller Weg, um ein ähnliches Ergebnis zu erreichen, ist einfach zu pd.Series(list(a)) tun. Dies wird eine Reihe von numpigen Arrays anstelle von Python-Listen machen, sollte also schneller sein als a.tolist, die eine Liste von Python-Listen zurückgibt.

+0

Danke, dass man für unter 25 Spalten schneller ist, aber viel langsamer, wenn es Hunderte oder Tausende gibt. – zemekeneng

+1

Ich fand einen anderen Ansatz, der schneller ist. Siehe die bearbeitete Antwort. – bpachev

+0

Schön, danke fürs Festhalten! Es ist das schnellste in jedem Szenario. – zemekeneng

1
pd.Series(list(a)) 

ist durchweg langsamer als

pd.Series(a.tolist()) 

20.000.000 getestet - 500.000 Zeilen

a = np.ones((500000,2)) 

zeigt nur 1.000.000 Zeilen:

%timeit pd.Series(list(a)) 
1 loop, best of 3: 301 ms per loop 

%timeit pd.Series(a.tolist()) 
1 loop, best of 3: 261 ms per loop 
+0

Das ist wahr, wenn Sie nur zwei Spalten haben. Probieren Sie ein paar Tausend und sehen Sie, was passiert. – bpachev