2017-06-21 1 views
2

In Pandas Wiederholung habe ich eine Reihe und einen Multiindex:erstellen Pandas Datenrahmen durch eine Zeile mit neuem Multiindex

s = pd.Series([1,2,3,4], index=['w', 'x', 'y', 'z']) 
idx = pd.MultiIndex.from_product([['a', 'b'], ['c', 'd']]) 

Was ist der beste Weg für mich, einen Datenrahmen zu schaffen, die idx als Index hat, und s als Wert für jede Zeile, den Index in S als Spalten beibehalten?

df = 
     w x y z 
a c 1 2 3 4 
    d 1 2 3 4 
b c 1 2 3 4 
    d 1 2 3 4 

Antwort

2

Mit dem pd.DataFrame Konstruktor gefolgt von assign

pd.DataFrame(index=idx).assign(**s) 

    w x y z 
a c 1 2 3 4 
    d 1 2 3 4 
b c 1 2 3 4 
    d 1 2 3 4 
+0

Dies ist eine sehr intelligente Lösung! – Allen

+0

Das ist super interessant. Das einzige, was ich beachten werde, ist, dass "assign" die Reihenfolge von "s" basierend auf seinem Index mischt (siehe den Abschnitt "Notizen" in [Dokumentation] (http://pandas.pydata.org/pandas-docs/stable/generated/ pandas.DataFrame.assign.html # Anmerkungen)). Wenn also die Indexnamen '[' w ',' x ',' y ',' a ']' statt dessen sind, springt die Spalte 'a' nach vorne. Aber das ist für meinen Zweck in Ordnung. – Zhang18

0

Verwenden [s] * len (n) als Daten, IDX als Index und s.index als eine Spalte df zu rekonstruieren.

pd.DataFrame([s]*len(s),idx,s.index) 
Out[56]: 
    w x y z 
a c 1 2 3 4 
    d 1 2 3 4 
b c 1 2 3 4 
    d 1 2 3 4 
+1

Das funktioniert nur zufällig weil 'len (s) == len (idx)'. Versuchen Sie 's = pd.Series ([0,1,2,3,4], index = ['v', 'w', 'x', 'y', 'z'])' und es schlägt fehl. Du willst das stattdessen 'pd.DataFrame ([s] * len (idx), idx, s.index)' – piRSquared

0

Sie können numpy.repeat mit numpy.ndarray.reshape für doppelte Daten verwenden und letzten DataFrame Konstruktor:

arr = np.repeat(s.values, len(idx)).reshape(-1, len(idx)) 
df = pd.DataFrame(arr, index=idx, columns=s.index) 
print (df) 
    w x y z 
a c 1 1 1 1 
    d 2 2 2 2 
b c 3 3 3 3 
    d 4 4 4 4 

Timings:

np.random.seed(123) 
s = pd.Series(np.random.randint(10, size=1000)) 
s.index = s.index.astype(str) 
idx = pd.MultiIndex.from_product([np.random.randint(10, size=250), ['a','b','c', 'd']]) 

In [32]: %timeit (pd.DataFrame(np.repeat(s.values, len(idx)).reshape(len(idx), -1), index=idx, columns=s.index)) 
100 loops, best of 3: 3.94 ms per loop 

In [33]: %timeit (pd.DataFrame(index=idx).assign(**s)) 
1 loop, best of 3: 332 ms per loop 

In [34]: %timeit pd.DataFrame([s]*len(idx),idx,s.index) 
10 loops, best of 3: 82.9 ms per loop 
+0

danke! Ich habe viel von Ihren Antworten auf diese (und andere) Frage gelernt, dass es einen Kompromiss zwischen Geschwindigkeit und syntaktischer Lokalisierung innerhalb von Pandas gibt. Ich verstehe jetzt, dass, wenn ich öfters öfter auf die Zahl zurückgreifen kann, meine Geschwindigkeit steigen kann! – Zhang18

+0

Ya, wenn Leistung nicht wichtig ist, sind alle Lösungen nett, gut lukc! – jezrael

Verwandte Themen