2017-06-30 9 views
0

Ich habe Daten über das Vorhandensein einer Reihe von Metaboliten in verschiedenen Abteilungen eines Systems. Ich habe auch Informationen darüber, welcher Typ die einzelnen Metaboliten sind. Ich möchte eine Häufigkeitstabelle, die die Anzahl der Metaboliten jedes Typs in jedem Kompartiment zeigt. Die Daten in etwa so aussehen:Pandas Häufigkeitstabelle basierend auf mehreren Kreuztabellen

df = pd.DataFrame({'met_id':['met_a','met_b','met_c','met_d','met_e','met_f'], 
        'met_type':['amino_acid','amino_acid','lipid','lipid','peptide','peptide'], 
        'comp_1':[True,False,True,True,False,True], 
        'comp_2':[False,True,True,False,True,True]}) 
print df 

gibt

comp_1 comp_2 met_id met_type 
0 True False met_a amino_acid 
1 False True met_b amino_acid 
2 True True met_c  lipid 
3 True False met_d  lipid 
4 False True met_e  peptide 
5 True True met_f  peptide 

ich eine Übersichtstabelle wollen (oder Datenrahmen) wie folgt aus:

met_type  comp_1 comp_2 
amino_acid 1  1 
lipid   2  1 
peptide  1  2 

angibt, wie viele von jeder Art von Metaboliten in jedem Fach. Ich kann die Zählungen mit Kreuztabellen- erhalten somit:

pd.crosstab(df_test.met_type,df_test.comp_1)[True] 

gibt

met_type 
amino_acid 1 
lipid   2 
peptide  1 
Name: True, dtype: int64 

und ich denke, ich jede dieser Serie verketten kann, aber gibt es eine saubere Art und Weise eine Tabelle mit Zählungen für alle zu schaffen, die Fachsäulen?

Antwort

1

können Sie verwenden groupby bedeuten

df = pd.DataFrame({'met_id': 
['met_a','met_b','met_c','met_d','met_e','met_f'], 
       'met_type': 
['amino_acid','amino_acid','lipid','lipid','peptide','peptide'], 
        'comp_1':[True,False,True,True,False,True], 
        'comp_2':[False,True,True,False,True,True]}) 
dfn = df.groupby("met_type").mean() 
dfn = dfn[['comp_1','comp_2']]*2 

Dies wird Ihnen die Übersichtstabelle

 
      comp_1 comp_2 
met_type     
amino_acid  1.0  1.0 
lipid   2.0  1.0 
peptide  1.0  2.0 

Wie Sie empfehlen wir Summe verwenden können (war noch ein Anfänger, dass die Zeit :))

 
      comp_1 comp_2 
met_type     
amino_acid  1  1 
lipid   2  1 
peptide   1  2 
+0

Ah, das funktioniert auf m Ich habe ein Beispiel, aber in meinem realen Dataset haben 'comp_1' und 'comp_2' einen booleschen Typ, daher erhalte ich den Fehler 'DataError: Keine numerischen Typen zum aggregieren'. Ich werde meine Frage bearbeiten, um das klarzustellen - gibt es einen ähnlichen Ansatz für Booleans? –

+0

Können Sie den realen Datensatz zeigen – Dark

+1

Sorry, eigentlich denke ich das Problem ist, dass es NaNs in den booleschen Listen gibt, die Ihre Antwort brechen. Ich kann nur die NaNs mit Falses für die Zwecke der Zusammenfassung ersetzen und es funktioniert super! Ich akzeptiere deine Antwort und konvertiere die NaNs. –

Verwandte Themen