2017-09-08 2 views
1

So in Pandas beschreiben, ich questionary bekam und ich 2 Spalten hier replizieren werden:Wie ein „detaillierte“ bekommen()

Range  Answer 
>30   maybe 
>30   yes 
<30   no 
<30   yes 
>30   maybe 
<30   yes 

Also, was ich tun muß, ist, durch Range-Gruppe und wissen, wie viele Antworten jeder Option erhalten jeweils, in diesem Fall:

Range  Answer 
<30   
      no: 1 
      yes:2 
      maybe:0 
>30   
      no: 0 
      yes:1 
      maybe:2 

in Wirklichkeit gibt es nicht zwei Spalten, aber viele von ihnen, und ich muß gruppen von einem von ihnen und dann diese Art von Statistiken erhalten für jede andere Spalte im Datenrahmen. Dies ist das erste Mal, dass ich mit kategorischen Daten arbeite und ich bin ziemlich verloren. Ich benutze Beschreibung() und es funktioniert für die häufigste Antwort, aber ich brauche es für jede Antwort, gibt es eine direkte Methode wie eine "detaillierte absteigende()"?

Antwort

0

Sie melt für reshape mit Aggregat size verwenden:

print (df) 
    Range Answer1 Answer2 Answer3 
0 >30 maybe  no  yes 
1 >30  yes  yes  no 
2 <30  no  yes  no 
3 <30  yes maybe  no 
4 >30 maybe  no  yes 
5 <30  yes  no  no 

print (df.melt('Range', var_name='Answers', value_name='Vals')) 
    Range Answers Vals 
0 >30 Answer1 maybe 
1 >30 Answer1 yes 
2 <30 Answer1  no 
3 <30 Answer1 yes 
4 >30 Answer1 maybe 
5 <30 Answer1 yes 
6 >30 Answer2  no 
7 >30 Answer2 yes 
8 <30 Answer2 yes 
9 <30 Answer2 maybe 
10 >30 Answer2  no 
11 <30 Answer2  no 
12 >30 Answer3 yes 
13 >30 Answer3  no 
14 <30 Answer3  no 
15 <30 Answer3  no 
16 >30 Answer3 yes 
17 <30 Answer3  no 

df1 = df.melt('Range', var_name='Answers', value_name='Vals') \ 
     .groupby(['Range', 'Answers', 'Vals']).size() 
print (df1) 
Range Answers Vals 
<30 Answer1 no  1 
       yes  2 
     Answer2 maybe 1 
       no  1 
       yes  1 
     Answer3 no  3 
>30 Answer1 maybe 2 
       yes  1 
     Answer2 no  2 
       yes  1 
     Answer3 no  1 
       yes  2 
dtype: int64 

Eine andere Lösung ist stack für reshape verwenden und value_counts:

df1 = df.set_index('Range').stack() \ 
     .groupby(level=[0,1]).value_counts() 
print (df1) 
Range     
<30 Answer1 yes  2 
       no  1 
     Answer2 maybe 1 
       no  1 
       yes  1 
     Answer3 no  3 
>30 Answer1 maybe 2 
       yes  1 
     Answer2 no  2 
       yes  1 
     Answer3 yes  2 
       no  1 
dtype: int64 
+1

Die Verwendung von Schmelze war einfach brillant, einfach, effizient und ich verstehe es vollständig. Ich verstehe das zweite Beispiel nicht, da ich noch nicht "Stack" studiert habe, aber ich studiere es gerade jetzt. Ich kann dir nicht mehr für deine Antworten danken. – Skirmitch

0

Eine Möglichkeit, mit crosstab

In [685]: pd.crosstab(df.Range, df.Answer).stack() 
Out[685]: 
Range Answer 
<30 maybe  0 
     no  1 
     yes  2 
>30 maybe  2 
     no  0 
     yes  1 
dtype: int64 

Oder groupby

In [690]: df.groupby(['Range', 'Answer']).size().unstack(fill_value=0).stack() 
Out[690]: 
Range Answer 
<30 maybe  0 
     no  1 
     yes  2 
>30 maybe  2 
     no  0 
     yes  1 
dtype: int64 
+0

Beautifull, es für 2 Variablen awesomely funktioniert, wird abwarten, ob gegen eine so etwas wie dies für mehrere Spalten gibt es oder ich bleibe bei dieser Antwort. Vielen Dank – Skirmitch

Verwandte Themen