2016-04-17 2 views
2

ich ein Student Prüfung Dataset habe wie folgt,Lang Wide-Format für mehrere Spalte in Python

userid  grade examid subject  numberofcorrectanswers numberofwronganswers 
4   5  8  Synonyms   NULL     NULL 
4   5  8  Sentence   NULL     NULL 
4   5  8  Whole Numbers  6      15 
4   5  8  Decimals   4      10 
5   5  9  Synonyms   NULL     NULL 
5   5  9  Sentence   NULL     NULL 
5   5  9  Whole Numbers  5      12 
5   5  9  Decimals   3      1 

Ich möchte dieses lange Format Wide-Format konvertieren, wo ich als die Daten haben kann,

userid  grade examid  Synonyms_numberofcorrectanswers   Synonyms_numberofwronganswers  Sentence_numberofcorrectanswers   Sentence_numberofwronganswers  Whole_numbers_numberofcorrectanswers  Whole_numbers_numberofwronganswers    Decimals_numberofcorrectanswers   Decimals_numberofwronganswers 
4   5   8    NULL         NULL        NULL         NULL        6           15           4           10 
5   5   9    NULL         NULL        NULL         NULL        5           12           3           1 

Die folgenden sind meine versucht,

data_subset.set_index(['userid', 'grade','examid','subject']).unstack('subject').reset_index() 

Aber diese in einer einzigen flachen Datenrahmen kommt nicht. Es gibt mehrere Hierarchien darin. Kann mir jemand helfen, es zu einem einzigen flachen Datenrahmen zu machen?

Danke

+0

Ich habe einige Beispiele [** hier **] (https://stackoverflow.com/q/47152691/2336654) – piRSquared

Antwort

1

Ich werde Alexanders Antwort erweitern. Sagen wir

df2 = df.groupby(['userid', 'grade','examid','subject']).sum().unstack('subject') 

Wir bekommen die Namen des Zwei-Ebenen-Spaltenindex als eine Liste von 2-Tupeln mit df2.columns.get_values() haben. Um es abzuflachen und die Namen kombinieren:

new_col_names = ['_'.join((b,a)) for a,b in df2.columns.get_values()] 
df2.columns = new_col_names 

Bei Bedarf:

  • Spalten zu sortieren: zum Beispiel df2.reindex(columns = sorted(df2.columns))

  • userid usw. als Spalten zu setzen, anstatt ein Multi-Index : df2.reset_index()

1

So etwas wie das?

>>> df.groupby(['userid', 'grade','examid','subject']).sum().unstack('subject') 
        numberofcorrectanswers         numberofwronganswers         
subject       Decimals Sentence Synonyms Whole Numbers    Decimals Sentence Synonyms Whole Numbers 
userid grade examid                            
4  5  8       4  NaN  NaN    6     10  NaN  NaN   15 
5  5  9       3  NaN  NaN    5     1  NaN  NaN   12 
+0

Wenn ich dies versuche, gibt es eine Hierarchie in Anzahl der richtigen Antworten und Anzahl der wrongansswers Spalte und in dem alles platziert ist. Ich sehe aus wie eine Ausgabe, die eine einzelne Ebene der Hierarchieausgabe geben würde, wie ich in der Beispielausgabe gezeigt habe. Kannst du mir bitte dabei helfen? – haimen

+0

Aber diese Werte sind null. Möchten Sie nur Dezimalstellen, Satz, Synonyme und ganze Zahlen, z. 6 + nan + nan + 4 = 10 für die obere linke Zelle? – Alexander

Verwandte Themen