Anzahl der Stapel- und Rückgabewerte für jede Variable?

19

Ich habe einen Datenrahmen, der Antworten von 19717 Personen auf die Wahl der Programmiersprachen durch Multiple-Choice-Fragen aufzeichnet. Die erste Spalte ist natürlich das Geschlecht des Befragten, während der Rest die Auswahl ist, die er ausgewählt hat. Wenn ich also Python auswähle, wird meine Antwort in der Python-Spalte aufgezeichnet und nicht in Bash und umgekehrt.

ID     Gender              Python    Bash    R    JavaScript    C++
0      Male                Python    nan     nan  JavaScript    nan
1      Female              nan       nan     R    JavaScript    C++
2      Prefer not to say   Python    Bash    nan  nan           nan
3      Male                nan       nan     nan  nan           nan

Was ich möchte, ist eine Tabelle, die die Anzahl der Instanzen jeder Kategorie unter GenderDatensätzen zurückgibt . Wenn also 5000 Männer in Python und 3000 Frauen in JS codiert sind, sollte ich Folgendes bekommen:

Gender              Python    Bash    R    JavaScript    C++
Male                5000      1000    800  1500          1000
Female              4000      500     1500 3000          800
Prefer Not To Say   2000      ...   ...    ...           860

Ich habe einige der Optionen ausprobiert:

df.iloc[:, [*range(0, 13)]].stack().value_counts()

Male                       16138
Python                     12841
SQL                         6532
R                           4588
Female                      3212
Java                        2267
C++                         2256
Javascript                  2174
Bash                        2037
C                           1672
MATLAB                      1516
Other                       1148
TypeScript                   389
Prefer not to say            318
None                          83
Prefer to self-describe       49
dtype: int64

Und es ist nicht das, was wie oben beschrieben erforderlich ist. Kann das bei Pandas gemacht werden?

Shiv_90
quelle

Antworten:

7

Eine andere Idee wäre, Werte entlang der Achse 1 zu erhalten, dann :apply joinget_dummiesgroupby

(df.loc[:, 'Python':]
 .apply(lambda x: '|'.join(x.dropna()), axis=1)
 .str.get_dummies('|')
 .groupby(df['Gender']).sum())

[aus]

                   Bash  C++  JavaScript  Python  R
Gender                                             
Female                0    1           1       0  1
Male                  0    0           1       1  0
Prefer not to say     1    0           0       1  0
Chris A.
quelle
7

Sie können Genderals Index und Summe festlegen :

s = df.set_index('Gender').iloc[:, 1:]
s.eq(s.columns).astype(int).sum(level=0)

Ausgabe:

                   Python  Bash  R  JavaScript  C++
Gender                                             
Male                    1     0  0           1    0
Female                  0     0  1           1    1
Prefer not to say       1     1  0           0    0
Quang Hoang
quelle
Aus irgendeinem Grund werden für jeden GenderIndex alle Nullen zurückgegeben .
Shiv_90
4

Angenommen, Ihr nanis NaN(dh es ist kein String), können wir dies nutzen, countda es ignoriert wird NaN, um die gewünschte Ausgabe zu erhalten

df_out = df.iloc[:,2:].groupby(df.Gender, sort=False).count()

Out[175]:
                   Python  Bash  R  JavaScript  C++
Gender
Male                    1     0  0           1    0
Female                  0     0  1           1    1
Prefer not to say       1     1  0           0    0
Andy L.
quelle
3

Sie können meltund verwendencrosstab

df1 = pd.melt(df,id_vars=['ID','Gender'],var_name='Language',value_name='Choice')
df1['Choice'] = np.where(df1['Choice'] == df1['Language'],1,0)
final= pd.crosstab(df1['Gender'],df1['Language'],values=df1['Choice'],aggfunc='sum')

print(final)
Language              Bash  C++  JavaScript  Python  R
Gender                                              
Female                  0    1           1       0  1
Male                    0    0           1       1  0
Prefer not to say       1    0           0       1  0
Datanovice
quelle
2

Lassen Sie uns zu einer Zeile gehen

df.drop('ID',1).melt('Gender').\
    query('variable==value').\
      groupby(['Gender','variable']).size().unstack(fill_value=0)
Out[120]: 
variable        Bash  C++  JavaScript  Python  R
Gender                                          
Female             0    1           1       0  1
Male               0    0           1       1  0
Prefernottosay     1    0           0       1  0
YOBEN_S
quelle