2017-12-30 5 views
1

Ich habe ein Datenframe mit drei Spalten: A, B, C. Nehmen wir an, A und B sind ganzzahlige Serien von 0 bis 10. Ich möchte ein erstellen neuer Datenrahmen, in dem eindeutige Werte von A der Index ist, eindeutige Werte von B sind die Spalten und jede Zelle ist der Mittelwert C, der an dem Schnittpunkt von Ai, Cj erhalten wird.Pandas: Erstellen eines Datenrahmens, der eine Spalte mit anderen zwei Spalten in Beziehung setzt

So zum Beispiel, wenn wir gruppiert, um die Datenrahmen wie folgt aus:

Cvalues = df.groupby(['A','B'],as_index=False).mean() 

in der (i, j) Position des Datenrahmens ich dort erstellen möchten wäre:

Cvalues.loc[Cvalues.A==i].loc[Cvalues.B==j].C 

Was ist der einfachste Weg das zu tun?

+1

Ihre Erklärung nicht hilfreich ist. Bitte geben Sie ein [mcve] mit einigen reproduzierbaren Datenbeispielen als Text und erwartete Ausgabe an. Das würde immens helfen, vor allem wenn Sie eine funktionierende, korrekte Antwort wünschen. –

+0

Sieht so aus, als könnten Sie 'Cvalues.unstack()' oder 'pivot_table' oder' crosstab' verwenden –

Antwort

1

Sie sind fast da. Sie können entweder pivot Ihre Cvalues, oder noch besser, gehen Sie direkt für pivot_table und nutzen Sie die integrierte Option aggfunc.

df = pd.DataFrame({'A':[2,0,1,1,2,0,1,0], 
        'B':[1,2,1,0,1,2,1,1], 
        'C':[10,20,30,40,50,60,70,80]}) 

Empfohlen One-Liner:

res = df.pivot_table(index='A', columns='B', values='C', aggfunc='mean') 

Making Your Methode Arbeit:

Cvalues = df.groupby(['A','B'],as_index=False).mean() 
res = Cvalues.pivot(index='A', columns='B', values='C') 

Warum sich die Mühe, aber nur für den Fall, können Sie machen dies ein wenig kompakter:

res = df.groupby(['A','B'],as_index=False).mean().pivot(index='A', columns='B', values='C') 

Hier ist das Ergebnis beiden Möglichkeiten:

B  0  1  2 
A     
0 NaN 80.0 40.0 
1 40.0 50.0 NaN 
2 NaN 30.0 NaN 

wo, an der Kreuzung von A=2 and B=1: 30.0 = (10 + 50)/2

Verwandte Themen