Unstack và trả về giá trị tính cho mỗi biến?


19

Tôi có khung dữ liệu ghi lại câu trả lời của 19717 sự lựa chọn ngôn ngữ lập trình của mọi người thông qua các câu hỏi trắc nghiệm. Cột đầu tiên tất nhiên là giới tính của người trả lời trong khi phần còn lại là lựa chọn họ chọn. Và do đó nếu tôi chọn Python thì phản hồi của tôi sẽ được ghi lại trong cột Python chứ không phải bash và ngược lại.

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

Những gì tôi muốn là một bảng trả về số lượng phiên bản của mỗi thể loại theo Genderhồ sơ. Do đó, nếu 5000 người đàn ông được mã hóa bằng Python và 3000 phụ nữ trong JS, thì tôi sẽ nhận được điều này:

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

Tôi đã thử một số tùy chọn:

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

Và đó không phải là những gì được yêu cầu như mô tả ở trên. Điều này có thể được thực hiện trong gấu trúc?

Câu trả lời:


7

Một ý tưởng khác là các giá trị dọc theo trục 1, sau đó :apply joinget_dummiesgroupby

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

[ngoài]

                   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

7

Bạn có thể đặt Genderlàm chỉ mục và tổng:

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

Đầu ra:

                   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

Vì một số lý do, điều này sẽ trả về tất cả 0 cho mỗi Genderchỉ mục.
Shiv_90

4

Giả sử nanlà của bạn NaN(nghĩa là nó không phải là chuỗi), chúng tôi có thể tận dụng countvì nó bỏ qua NaNđể có được đầu ra mong muốn

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

3

Bạn có thể meltvà sử dụngcrosstab

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

2

Hãy để chúng tôi đẩy đến một dòng

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.