প্রতিটি পরিবর্তনকের জন্য আনস্ট্যাক এবং রিটার্নের মান গণনা করা হয়?


19

আমার কাছে একটি ডেটা ফ্রেম রয়েছে যা একাধিক পছন্দ প্রশ্নের মাধ্যমে 19717 লোকের প্রোগ্রামিং ভাষার ভাষা পছন্দগুলির প্রতিক্রিয়া রেকর্ড করে। প্রথম কলামটি অবশ্যই উত্তরদাতার লিঙ্গ এবং বাকীগুলি তাদের পছন্দগুলি বেছে নেওয়া হয়। আর তাই আমি যদি পাইথনটি বেছে নিই তবে আমার প্রতিক্রিয়া পাইথন কলামে লিপিবদ্ধ করা হবে এবং বাশ এবং তদ্বিপরীত হবে না।

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

আমি যা চাই তা হ'ল একটি টেবিল যা Genderরেকর্ডের অধীনে প্রতিটি বিভাগের উদাহরণগুলি প্রদান করে । অতএব যদি পাইথনে 5000 পুরুষ এবং জেএস-এ 3000 জন মহিলা কোডড থাকেন তবে আমার এটি পাওয়া উচিত:

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

আমি কয়েকটি বিকল্প ব্যবহার করে দেখেছি:

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

এবং উপরে বর্ণিত হিসাবে এটি প্রয়োজনীয় নয়। এই পান্ডাতে করা যেতে পারে?

উত্তর:


7

আর একটি ধারণা হ'ল অক্ষ 1 সহ মানগুলি হবে , তারপরে :apply joinget_dummiesgroupby

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

[OUT]

                   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

আপনি Genderসূচক এবং যোগফল হিসাবে সেট করতে পারেন :

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

আউটপুট:

                   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

কিছু কারণে এটি প্রতিটি Genderসূচকের জন্য সমস্ত 0 টি ফিরে আসছে ।
শিব_ 90

4

ধরুন আপনার nanএটি NaN(যেমন এটি স্ট্রিং নয়), আমরা সুবিধা নিতে পারি countকারণ এটি NaNপছন্দসই আউটপুট পেতে উপেক্ষা করে

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

আপনি meltএবং ব্যবহার করতে পারেনcrosstab

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

আসুন এক লাইনে ধাক্কা দাও

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.