2016-04-13 9 views
1

Ich habe ein DataFrame die wie folgt aussieht:Wie "entwirren" Sie einen Datenrahmen mit den Werten der Zeilen?

class passed  failed   extra_teaching 
A11  1   2    0.5 
A12  2   1    0.7 

ich zu ‚entwirren‘ will die DataFrame, und die Informationen über die Klasse verlieren, aber die Informationen auf extra_teaching halten, so dass ich am Ende für die jeweils mit einer Reihe nach oben einzelner Schüler, der bestanden hat.

So ist die DataFrame sollte am Ende wie folgt suchen:

pass   extra_teaching 
1    0.5 
0    0.5 
0    0.5 
1    0.7 
1    0.7 
0    0.7 

Ich habe keine Ahnung, wie diese außer vielleicht in pandas, zu tun, indem iterrows() mit und manuell Zeilen in eine neue DataFrame anhängt - hat ein jeder bekam sauberer Weg?

UPDATE:

ich versucht, dies scheint aber nicht sehr elegant zu arbeiten:

temp = [] 
df = df.set_index('class') 
for idx in df.index: 
    row = df.loc[idx] 
    t = {'class': idx, 'extra_teaching': row['extra_teaching']} 
    for i in range(0, int(row['passed'])): 
     t['pass'] = 1 
     temp.append(t) 
    for i in range(0, int(row['failed'])): 
     t['pass'] = 0 
     temp.append(t) 
df_exploded = pd.DataFrame(temp) 
+0

Make-Klasse Ihre Index, Schleife über jedes Element davon, berechnen Sie den Summenpass ed + für jede Zeile fehlgeschlagen und dann für jede Zeile einen Datenrahmen erstellt (z.B. jede Klasse) und verketten alle von ihnen. Sie möchten vielleicht eine Spalte für jede Klasse einführen, in der Sie den Pass-Vektor speichern, z. [1 0 0] und [1 1 0] in diesem Fall. Sollte von dort einfach sein – tschm

+0

Wie werden die drei Spalten 'class',' passed' und 'failed' logisch in' pass' übersetzt? – Stefan

+0

@Stefan ignorieren wir "Klasse", es ist nur da, um zu erklären, was die Daten sind. "bestanden" bedeutet immer "pass = 1", "fehlgeschlagen" bedeutet immer "pass = 0". – Richard

Antwort

1

Versuchen:

def teaching_results(x): 
    num_rows = x.passed.iloc[0] + x.failed.iloc[0] 
    passed = x.passed.iloc[0] * [1] + x.failed.iloc[0] * [0] 
    extra_teaching = num_rows * [x.extra_teaching.iloc[0]] 
    class_code = x['class'].iloc[0] 
    return pd.DataFrame({'pass': passed, 'extra_teaching': extra_teaching, 'class': class_code}) 

df.groupby('class', as_index=False).apply(lambda x: teaching_results(x)) 

zu erhalten:

class extra_teaching pass 
0 0 A11    0.5  1 
    1 A11    0.5  0 
    2 A11    0.5  0 
1 0 A12    0.7  1 
    1 A12    0.7  1 
    2 A12    0.7  0 
+0

Ah toll. Vielen Dank. Gibt es eine Möglichkeit, die 'class'-Variable als eine Spalte in dem obigen zu behalten, statt sich zu' 0', '1' usw. zu ändern? – Richard

+0

Ja, siehe Update. – Stefan

+0

Erstaunlich! Vielen Dank. – Richard

Verwandte Themen