2016-08-09 10 views
5

Mam tablicy 2D NumPy które chciałbym umieścić w serialu Pandy (nie DataFrame):Put tablicy 2D do Pandy Series

>>> 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.]]) 

Ale to zgłasza błąd:

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

jest możliwe 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] 

Czy istnieje lepszy sposób?

+0

Domyślnie Pandy trafia kształt np tablica i przydziela odpowiednio DataFrame. Musisz więc oszukać kształt swojej tablicy np. ... To, co "hakujesz", robi, chociaż po jednym rzędzie naraz. – Kartik

+0

Jakieś przemyślenia na temat zawijania każdego wiersza na liście przy użyciu operacji macierzy? – zemekeneng

+2

Po prostu z ciekawości, dlaczego miałbyś tego chcieć? –

Odpowiedz

4

Cóż, można użyć funkcji numpy.ndarray.tolist, tak:

>>> 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:

Szybszy sposób, aby osiągnąć podobny wynik jest po prostu zrobić pd.Series(list(a)). Spowoduje to utworzenie serii numpy array zamiast list w Pythonie, więc powinna być szybsza niż a.tolist, która zwraca listę list w Pythonie.

+0

Dzięki temu jest on szybszy dla mniej niż 25 kolumn, ale znacznie wolniejszy, jeśli są setki lub tysiące. – zemekeneng

+1

Znalazłem inne podejście, które jest szybsze. Zobacz edytowaną odpowiedź. – bpachev

+0

Miło, dzięki za trzymanie się! Jest najszybszy w każdym scenariuszu. – zemekeneng

1
pd.Series(list(a)) 

jest konsekwentnie wolniejsze niż

pd.Series(a.tolist()) 

przetestowany 20.000.000 - 500000 wiersze

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

pokazujące tylko 1000000 rzędów:

%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

Jest to prawdą, gdy masz tylko dwie kolumny. Wypróbuj kilka tysięcy i zobacz, co się stanie. – bpachev