2017-07-24 7 views
0

Ich habe Datenframe und Pivot-Tabelle und ich muss einige Werte in Dataframe von pivot_table Spalten ersetzen.Pandas: Werte im Datenframe von pivot_table ersetzen

Datenrahmen:

 access_code        ID cat1 cat2 cat3 
g1gw8bzwelo83mhb 0433a3d29339a4b295b486e85874ec66 1 2    

g0dgzfg4wpo3jytg 04467d3ae60fed134077a26ae33e0eae 1 2    

g1gwui6r2ep471ht 06e3395c0b64a3168fbeab6a50cd8f18 1 2    

g05ooypre5l87jkd 089c81ebeff5184e6563c90115186325 1     

g0ifck11dix7avgu 0d254a81dca0ff716753b67a50c41fd7 1 2 3 

Pivot-Tabelle:

type                1  2                            \ 
access_code  ID        member_id   
g1gw8bzwelo83mhb 0433a3d29339a4b295b486e85874ec66 1045794  1023 923          1     122  
g05ooypre5l87jkd 089c81ebeff5184e6563c90115186325 768656   203 243        1     169 
g1gwui6r2ep471ht 06e3395c0b64a3168fbeab6a50cd8f18 604095   392 919        1     35 
g06q0itlmkqmz5cv f4a3b3f2fca77c443cd4286a4c91eedc 1457307  243       1      
g074qx58cmuc1a2f 13f2674f6d5abc888d416ea6049b57b9 5637836          1      
g0dgzfg4wpo3jytg 04467d3ae60fed134077a26ae33e0eae 5732738  111  2343        1      

Wunsch Ausgang:

 access_code        ID cat1 cat2 cat3 
g1gw8bzwelo83mhb 0433a3d29339a4b295b486e85874ec66 1023 923    

g0dgzfg4wpo3jytg 04467d3ae60fed134077a26ae33e0eae 111 2343    

g1gwui6r2ep471ht 06e3395c0b64a3168fbeab6a50cd8f18 392 919     

g05ooypre5l87jkd 089c81ebeff5184e6563c90115186325 1     

g0ifck11dix7avgu 0d254a81dca0ff716753b67a50c41fd7 1 2 3 

Wenn ich

df.ix[df.cat1 == 1] = pivot_table['1'] 

es gibt Fehler zurück ValueError: cannot set using a list-like indexer with a different length than the value

+1

"es gibt Fehler zurück." Welcher Fehler? –

+0

@JohnZwinck ValueError: kann nicht mit einem list-like Indexer mit einer anderen Länge als den Wert –

+0

'merge' dann' fillna' Ende 'drop' Spalten – Wen

Antwort

0

Solange Ihr Dataform nicht sehr groß ist, können Sie es auf einige wirklich hässliche Weise geschehen lassen. Ich bin mir sicher, dass jemand anderes Ihnen eine elegantere Lösung bieten wird, aber in der Zwischenzeit könnte dieses Klebeband Sie in die richtige Richtung weisen.

Denken Sie daran, dass ich dies in diesem Fall mit 2 Datenrahmen anstelle von 1 Datenrahmen und 1 Pivot-Tabelle gemacht habe, da ich bereits genug Mühe hatte, die Datenrahmen aus den Textdaten zu formatieren.

Da in Ihren Daten leere Felder vorhanden sind und meine Datenrahmen dies nicht haben, konvertieren Sie die leeren Felder zuerst in Nullen.

df = df.replace(r'\s+', 0, regex=True) 

nun dafür sorgen, dass Ihre Daten tatsächlich schwimmen, sonst die Vergleiche

df[['cat1', 'cat2', 'cat3']] = df[['cat1', 'cat2', 'cat3']].astype(float) 

Und für das fizzly Feuerwerk scheitern:

df.cat1.loc[df.cat1 == 1] = piv['1'].loc[df.loc[df.cat1 == 1].index].dropna() 
df.cat1 = df.cat1.fillna(1) 

df.cat2.loc[df.cat2 == 2] = piv['2'].loc[df.loc[df.cat2 == 2].index].dropna() 
df.cat2 = df.cat2.fillna(2) 

df = df.replace(0, ' ') 

Die fillna sind nur Ihre gewünschte Ausgabe zu erstellen , in dem Sie einige Zeilen noch nicht verarbeitet haben. Ich nehme an, dass diese spaltenweise NaN-Füllung bei Ihrer tatsächlichen Verwendung nicht passieren wird.

Verwandte Themen