2017-03-13 4 views
3

Wie Reihenfolge im Ergebnis der pd.crosstab ändern:Pandas: Änderung der Reihenfolge der Kreuztabellen- Ergebnis

pd.crosstab(df['col1'], df['col2']) 

Ich mag wäre in der Lage sein, durch sortieren:

  • eindeutige Werte von entweder df [ 'spalte1'] oder df [ 'col2'] (cols/Zeilen des Kreuztabellen- Ergebnis)
  • durch Randwerte (zB zeigt höher- Zählwerte von df [ ‚col1‘] näher an der Spitze)
+2

'pandas.DataFrame.sort_values' und' pandas.DataFrame.sort_index' –

+2

http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples –

+0

Sie möchten aussehen bei 'pandas.pivot_table'. Es kann oft sehr ähnliche Dinge wie "Kreuztabellen" tun. und Sie können diese sortieren. Hier ist ein [Beispiel] (http://stackoverflow.com/questions/10595327/pandas-sort-pivot-table) – MattR

Antwort

3

Nun, wäre es einfacher, Ihnen eine Lösung zu geben, wenn Sie ein Beispiel Ihrer Daten zur Verfügung gestellt, da es dementsprechend sehr unterschiedlich sein kann. Ich werde versuchen, ein Fall-Szenario und eine mögliche Lösung unten zu erstellen.

Wenn wir die Beispieldaten und Kreuztabellen-:

a = np.array(['foo', 'foo', 'foo', 'foo', 'bar', 'bar', 
     'bar', 'bar', 'foo', 'foo', 'foo'], dtype=object) 

c = np.array(['dull', 'dull', 'shiny', 'dull', 'dull', 'weird', 
     'shiny', 'dull', 'shiny', 'shiny', 'shiny'], dtype=object) 

CT = pd.crosstab(a, c, rownames=['a'], colnames=['c']) 

CT 

Wir haben die folgende Ausgabe:

enter image description here

Das ist eine regelmäßige Datenrahmen Objekt, es ist einfach "crosstabed" oder besser noch " pivotabled "entsprechend.

Sie möchten zeigen:

  1. eindeutige Werte von entweder df [ 'col1'] oder df [ 'col2'] (cols/Reihen des Kreuz Ergebnis)
  2. durch marginale Werte (zB höhere Zählwerte df zeigt [ ‚col1‘] näher an der Spitze)

lässt mit „1“ So starten:

Es gibt verschiedene Möglichkeiten, wie Sie das tun, eine einfache Lösung sein würde zeige das gleiche Datafram das Objekt mit booleschen Werten für einzelne Fälle;

[CT == 1] 

enter image description here

dass Format sein könnte jedoch nicht das, was Sie bei großen Datenrahmen wünschen.

könnten Sie drucken nur die positiven Fälle oder Liste/anhängen ‚em, ein einfaches Beispiel wäre:

for col in CT.columns: 

    for index in CT.index: 

     if CT.loc[index,col] == 1: 

      print (index,col,'singular') 

Ausgang:

('bar', 'shiny', 'singular') 
('bar', 'weird', 'singular') 

Der zweite Punkt/Wunsch ist komplizierter. Sie möchten nach höherem Wert bestellen. Aber es könnte Abweichungen geben. Ein höherer Wert in einer Spalte, der einem Satz von Indizes zugeordnet ist, wird höchstwahrscheinlich in der Reihenfolge von der zweiten Spalte abweichen (die auch in denselben Indizes enthalten ist).

Daher können Sie wählen, um eine bestimmte Spalte zu bestellen:

CT.sort_values('column_name', ascending=False) 

Oder Sie können eine Metrik definieren, durch die Sie bestellen möchten (Zeilenwert bedeuten) und Art entsprechend.

Hoffe, dass hilft!

Verwandte Themen