2016-07-27 13 views
5

ich in R wissen kann ich tidyr für folgende Zwecke verwenden:Spalten zu einer Pivot-Tabelle hinzufügen (Pandas)

data_wide <- spread(data_protein, Fraction, Count) 

und data_wide alle Spalten von data_protein erben werden, die nicht verbreitet werden.

Protein Peptide Start Fraction Count 
1    A 122  F1  1 
1    A 122  F2  2  
1    B 230  F1  3  
1    B 230  F2  4 

wird

Protein Peptide Start F1 F2 
1    A 122 1 2 
1    B 230 3 4  

Aber in Pandas (Python),

data_wide = data_prot2.reset_index(drop=True).pivot('Peptide','Fraction','Count').fillna(0) 

erbt nichts nicht in der Funktion angegeben (Index, Schlüssel, Wert). So entschied ich es durch df.join() zu verbinden:

data_wide2 = data_wide.join(data_prot2.set_index('Peptide')['Start']).sort_values('Start') 

Aber das erzeugt Duplikate der Peptide, weil es mehrere Startwerte sind. Gibt es einen einfacheren Weg, dies zu lösen? Oder ein spezieller Parameter für Join, der Wiederholungen auslässt? Vielen Dank im Voraus.

Antwort

2

versuchen Sie dies:

In [144]: df 
Out[144]: 
    Protein Peptide Start Fraction Count 
0  1  A 122  F1  1 
1  1  A 122  F2  2 
2  1  B 230  F1  3 
3  1  B 230  F2  4 

In [145]: df.pivot_table(index=['Protein','Peptide','Start'], columns='Fraction').reset_index() 
Out[145]: 
     Protein Peptide Start Count 
Fraction       F1 F2 
0    1  A 122  1 2 
1    1  B 230  3 4 

Sie auch explizit Count Spalte angeben:

In [146]: df.pivot_table(index=['Protein','Peptide','Start'], columns='Fraction', values='Count').reset_index() 
Out[146]: 
Fraction Protein Peptide Start F1 F2 
0    1  A 122 1 2 
1    1  B 230 3 4 
+0

In welchem ​​Schritt tue ich das? Wann gebe ich an, dass Count der Wert für Fraction ist? – Nico

+1

@Nico, ich habe meine Antwort aktualisiert - bitte überprüfen – MaxU

1

stack Verwendung:

df.set_index(df.columns[:4].tolist()) \ 
    .Count.unstack().reset_index() \ 
    .rename_axis(None, axis=1) 

enter image description here