2013-01-17 33 views
7

Wygląda mi na błąd w pandach.Series.Zmiana kształtu serii pand?

a = pd.Series([1,2,3,4]) 
b = a.reshape(2,2) 
b 

b ma typ serii, ale nie może zostać wyświetlony, ostatnia wypowiedź daje wyjątek, bardzo długi, ostatni wiersz jest „Błąd typu:% d Format: wymagany jest numer, nie numpy.ndarray”. b. Zwroty (2,2), które są sprzeczne z ich typem. Zgaduję, że może pandas.Series nie implementuje funkcji zmiany kształtu i wzywam wersję z np.array? Ktoś też widzi ten błąd? Jestem w pandach 0.9.1.

+2

Nie znam pand, ale rozumiem, że jego uroki i ograniczenia polegają na tym, że mają dedykowane obiekty dla tablic o różnych wymiarach. Więc nawet jeśli w tle jest numpy, 'pd.Series' jest zawsze 1D, a' pd.DataFrame' jest zawsze 2D. Więc przekształcenie jednego z tych obiektów w sposób, w jaki robisz, nie ma większego sensu. – Jaime

+0

"Droga ** twoja ** robienie" powinna być "drogą **, którą robisz" ... wstydź się mnie! – Jaime

Odpowiedz

11

Można zadzwonić reshape na wartości tablica z serii: (? Ty ignorować indeks)

In [4]: a.values.reshape(2,2) 
Out[4]: 
array([[1, 2], 
     [3, 4]], dtype=int64) 

I rzeczywiście myślę, że nie zawsze będzie sensu stosować reshape do serialu i że rację sądząc, że to Reshape zaledwie numPy za:

a.reshape?
Docstring: See numpy.ndarray.reshape

powiedział, że zgadzam się z faktem, że Chodźmy spróbować zrobić to wygląda na błąd.

+0

Kiedyś podklasowałem 'ndarray', aby zaimplementować obiekt o stałej wymiarowości. Kuszące jest uchwycenie "zmiany" i nie pozwalają na to, ale wiele fajnych rzeczy, które pokochałeś w Numpy, polega na zmianie wymiarów podstawowych danych, np. pozbyć się 'reshape' i' tile' nie działa. Być może jest to niewielka, nieunikniona cena, którą należy zapłacić za ponowne wykorzystanie silnika w Pandach. – Jaime

+0

@Jaime fakt, że powoduje wyjątek przy próbie wykonania, jest z pewnością błędem, czy powinien pozwolić ci zrobić to w DataFrame (i reindeksie), czy też metoda nie powinna być dostępna? –

+0

Chodzi o to, że nie możesz go uczynić niedostępnym bez przerywania innej funkcjonalności, chyba że zechcesz przerobić dużo tego, co numpy daje za darmo. To nie jest miłe, zgadzam się, ale to może być najlepsze, co jest możliwe. – Jaime

1

Funkcja Reshape przyjmuje nowy kształt jak krotki, a nie jak wielu argumentów:

In [4]: a.reshape? 
Type:  function 
String Form:<function reshape at 0x1023d2578> 
File:  /Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/numpy/core/fromnumeric.py 
Definition: numpy.reshape(a, newshape, order='C') 
Docstring: 
Gives a new shape to an array without changing its data. 

Parameters 
---------- 
a : array_like 
    Array to be reshaped. 
newshape : int or tuple of ints 
    The new shape should be compatible with the original shape. If 
    an integer, then the result will be a 1-D array of that length. 
    One shape dimension can be -1. In this case, the value is inferred 
    from the length of the array and remaining dimensions. 

Reshape faktycznie realizowanego w serialu i zwróci ndarray:

In [11]: a 
Out[11]: 
0 1 
1 2 
2 3 
3 4 

In [12]: a.reshape((2, 2)) 
Out[12]: 
array([[1, 2], 
     [3, 4]]) 
0

Państwo mogą bezpośrednio użyj a.reshape((2,2)) do przekształcenia serii, ale nie możesz zmienić kształtu obiektu DataFrame pandy bezpośrednio, ponieważ nie ma funkcji przekształcania dla pandy DataFrame, ale możesz zmienić kształt na numpy ndarray:

  1. nawrócony DataFrame do NumPy ndarray
  2. nie zmienią
  3. przekonwertować z powrotem

przykład

a = pd.DataFrame([[1,2,3],[4,5,6]]) 
b = a.as_matrix().reshape(3,2) 
a = pd.DataFrame(b) 
0

Wystarczy użyć tego kodu poniżej:

b=a.values.reshape(2,2) 

Myślę, że to pomoże. możesz bezpośrednio używać tylko funkcji reshape(). Ale da to w przyszłości ostrzeżenie

+1

Dodaj trochę objaśnień wraz z kodem, ponieważ pomaga to zrozumieć twój kod. Odpowiedzi tylko na kod są niezadowolone. –

Powiązane problemy