2017-04-21 1 views
1

Betrachten Sie die unten Pandas Serie neu zu gestalten,einen Pandas Datenrahmen Index Objekt Spalten

index = list('abcdabcdabcd') 
df = pd.Series(np.arange(len(index)), index = index) 

Meine gewünschte Ausgabe ist,

a b c d 
0 0 1 2 3 
1 4 5 6 7 
2 8 9 10 11 

ich einige Mühe mit pd.pivot_table gesetzt haben, pd.unstack und wahrscheinlich liegt die Lösung in der richtigen Verwendung eines von ihnen. Der nächstgelegene ich erreicht haben, ist

df.reset_index(level = 1).unstack(level = 1) 

aber das macht, gibt mir nicht die Ausgabe ich meine Suche nach

// hier ist etwas, noch näher an die gewünschte Ausgabe, aber ich bin nicht in der Lage, den Index zu handhaben Gruppierung.

df.to_frame().set_index(df1.values, append = True, drop = False).unstack(level = 0) 

    a b  c  d 
0 0.0 NaN NaN NaN 
1 NaN 1.0 NaN NaN 
2 NaN NaN 2.0 NaN 
3 NaN NaN NaN 3.0 
4 4.0 NaN NaN NaN 
5 NaN 5.0 NaN NaN 
6 NaN NaN 6.0 NaN 
7 NaN NaN NaN 7.0 
8 8.0 NaN NaN NaN 
9 NaN 9.0 NaN NaN 
10 NaN NaN 10.0 NaN 
11 NaN NaN NaN 11.0 

Antwort

3

Ein bisschen allgemeinere Lösung cumcount mit neuen Indexwerte zu bekommen, und pivot die Umgestaltung zu tun:

# Reset the existing index, and construct the new index values. 
df = df.reset_index() 
df.index = df.groupby('index').cumcount() 

# Pivot and remove the column axis name. 
df = df.pivot(columns='index', values=0).rename_axis(None, axis=1) 

die resultierende Ausgabe:

a b c d 
0 0 1 2 3 
1 4 5 6 7 
2 8 9 10 11 
+0

wow! sehr schlau ! – MaxU

+0

in der Tat sehr nachdenklich –

0

Hier ist ein Weg, wenn der Index in der gleichen Reihenfolge Radfahren wird immer funktionieren wird und Sie wissen, dass die „Zeit“ (in diesem Fall 4):

>>> pd.DataFrame(df.values.reshape(-1,4), columns=list('abcd')) 
    a b c d 
0 0 1 2 3 
1 4 5 6 7 
2 8 9 10 11 
>>> 
+0

der Index Zyklus wird in der gleichen Reihenfolge sein. Aber die Indexlänge muss nicht notwendigerweise durch 4 teilbar sein, zum Beispiel kann ['a', 'b', 'a', 'b', 'a'] nicht in ein (2,2) Array in numpy umgeformt werden. Allerdings denke ich in Pandas, es werden NaN-Füllwerte sein. Hoffe ich mache Sinn :) –

+0

@SirajS. mit anderen Worten, es endet möglicherweise nicht am Ende eines Zyklus? –

+0

ja. die Länge der Elemente darf nicht perfekt mit der Länge der Spalten teilbar sein. In diesem Fall funktioniert eine numpy.reshape() nicht –

Verwandte Themen