2016-11-30 127 views
1

如何獲得以下腳本中的每個單獨名稱,以便在其名稱旁邊同時包含「是」和「否」?即使它是零,我也需要爲每個人都提供一些價值。pandas groupby列丟失

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'names': ['Charlie', 'Charlie', 'Charlie', 'Charlie', 'Bryan', 
          'Bryan', 'Bryan', 'Bryan', 'Jaimie', 'Jaimie', 
          'Jaimie', 'Jaimie'], 
        'passed': ['YES', 'YES', 'YES', 'YES', 'NO', 'NO', 'NO', 'NO', 
           'YES', 'NO', 'YES', 'NO']}) 

df2 = pd.DataFrame(df.groupby([df['names'], df['passed']]).size()) 
df2.columns = ['Count'] 

print(df2) 

   Count 
names passed  
Bryan NO   4 
Charlie YES   4 
Jaimie NO   2 
     YES   2 

回答

3

您可以使用重建索引:

df2 
Out: 
       Count 
names passed  
Bryan NO   4 
Charlie YES   4 
Jaimie NO   2 
     YES   2 

idx = pd.MultiIndex.from_product([df['names'].unique(), df['passed'].unique()]) 

df2.reindex(idx, fill_value=0) 
Out: 
      Count 
Charlie YES  4 
     NO  0 
Bryan YES  0 
     NO  4 
Jaimie YES  2 
     NO  2 

在這個例子中,交叉與拆散也可以是一種選擇:

pd.crosstab(df['passed'], df['names']).unstack() 
Out: 
names passed 
Bryan NO  4 
     YES  0 
Charlie NO  0 
     YES  4 
Jaimie NO  2 
     YES  2 
dtype: int64 
+0

謝謝!這正是我所期待的。 – Daniel

+2

很棒的回答。 爲了紀錄,這裏的reindex解決方案比交叉錶快4倍(2ms與8ms) –