2017-12-16 1 views
1

Ich habe einen Datenrahmen df der folgenden Art:Verkettung von Kreuztabellenwerten mit Dataframe?

ID Result Other_val 
1 A  y 
2 B  x 
2 A  x 
3 C  abc 

Nach pd.crosstab(df.ID, df.Result) verwenden, erhalte ich eine Kreuztabellen- wie folgt aus:

Result A B C 
ID 
1  1 0 0 
2  1 1 0 
3  0 0 1 

Ich möchte nun diese Werte an das Ende meiner ursprünglichen verketten Datenrahmen (nach dem Entfernen der bereits vorhandenen Spalte), um etwas wie folgt zu erhalten:

ID A B C Other_val 
1 1 0 0 y 
2 1 1 0 x 
3 0 0 1 abc 

Allerdings bin ich ratlos. Ich kann nicht scheinen pd.concat() zu verwenden, um die obige Tabelle wegen der seltsamen Weise zu bilden, die die Kreuztabellentabelle indiziert wird.

Irgendwelche Hilfe?

+0

'Other_val' auch' x y abc' sein könnte, oder bin falsch verwenden kann ich? Wie entscheiden Sie über die Bestellung dort? – Cleb

+1

@Cleb, du hast Recht! das war ein Tippfehler- es behoben – mDe

+0

Hope die Link-Hilfe https://StackOverflow.com/Questions/47152691/How-to-Pivot-a-Dataframe/47152692#47152692 – Wen

Antwort

3

Ich denke, was Sie suchen, ist , weil Sie ID und Other_val gruppieren müssen.

In [5]: pd.crosstab([df.ID, df.Other_val], df.Result) 
Out[5]: 
Result  A B C 
ID Other_val   
1 y   1 0 0 
2 x   1 1 0 
3 abc  0 0 1 
+1

Das ist viel sauberer als meins und sollte wahrscheinlich die akzeptierte Antwort (+ 1); habe nicht einmal darüber nachgedacht, sondern einfach blind die Datenframes zusammengefügt ...;) Du könntest noch einen '.reset_index()' hinzufügen, wenn du magst ... – Cleb

+0

Danke @Cleb. Schade, dass es nicht akzeptiert wurde. – laguittemh

+1

Deshalb habe ich Ihre Antwort zumindest upvoted und auch empfohlen, Ihre zu akzeptieren (siehe Kommentar unten meine Antwort). – Cleb

1

können Sie tun

df2 = pd.crosstab(df.ID, df.Result) 

und dann entweder

df_final = df.drop('Result', axis=1).drop_duplicates('ID').join(df2, on='ID') 

die

ID Other_val A B C 
0 1   y 1 0 0 
1 2   x 1 1 0 
3 3  abc 0 0 1 

gibt Wenn Sie die Spalten, die Sie Ihre gewünschte Ergebnis

erhalten neu anordnen möchten
df_final = df_final[['ID', 'A', 'B', 'C', 'Other_val']] 

    ID A B C Other_val 
0 1 1 0 0   y 
1 2 1 1 0   x 
3 3 0 0 1  abc 

Sie auch concat wie diese

pd.concat([df.drop('Result', axis=1).drop_duplicates('ID').set_index('ID'), df2], axis=1) 

    Other_val A B C 
ID     
1   y 1 0 0 
2   x 1 1 0 
3  abc 0 0 1 
+0

Das hat funktioniert! Vielen Dank! – mDe

+0

@mDe: Gut, dass es geholfen hat; Vielleicht möchten Sie sich jedoch die Antwort von Laguittemh ansehen, die viel sauberer wirkt (Sie können meine Antwort immer inakzeptabel nehmen und akzeptieren). Ich habe nicht einmal darüber nachgedacht, sondern einfach nur die Datenframes verschmolzen ... :) – Cleb