2017-08-03 75 views
3

我有一個數據幀包含兩個變量:IDoutcome。首先嚐試groupbyID,然後統計該ID內的outcome的唯一值的數量。Groupby並計算唯一值的數量(Pandas)

df 
ID outcome 
1  yes 
1  yes 
1  yes 
2  no 
2  yes 
2  no 

預期輸出:

ID yes no 
1  3  0 
2  1  2 

我的代碼df[['PID', 'outcome']].groupby('PID')['outcome'].nunique()給出了獨特的價值本身的數量,使得:

ID 
1 2 
2 2 

但我需要的yesno的計數,我怎麼能做到這一點?謝謝!

回答

5

pd.crosstab怎麼樣?

In [1217]: pd.crosstab(df.ID, df.outcome) 
Out[1217]: 
outcome no yes 
ID    
1   0 3 
2   2 1 
+1

我必須找到一個新的**選項2 ** – piRSquared

+0

@piRSquared其他人想出這是可能的只是一個時間問題:p –

+0

怎麼樣?這很棒! – Kay

1

分組在ID列,然後在outcome列上使用value_counts進行聚合。這會產生一系列的結果,因此您需要使用.to_frame()將其轉換回數據框,以便您可以拆除yes/no(即將它們作爲列)。然後用零填充空值。

df_total = df.groupby('ID')['outcome'].value_counts().to_frame().unstack(fill_value=0) 
df_total.columns = df_total.columns.droplevel() 
>>> df_total 
outcome no yes 
ID    
1   0 3 
2   2 1 
+0

@piRSquared是的。謝謝。 – Alexander

0

使用​​和pd.concat

df1 = df.set_index('ID') 
pd.concat([df1.outcome.eq('yes').sum(level=0), 
      df1.outcome.ne('yes').sum(level=0)], keys=['yes','no'],axis=1).reset_index() 

輸出:

ID yes no 
0 1 3.0 0.0 
1 2 1.0 2.0 
0

最有效的設置,這將防止任何過去,現在和未來的錯誤,並採取快速矢量化功能優勢做(瘋狂簡單)以下的事情:

df['dummy_yes'] = df.outcome == 'yes' 
df['dummy_no'] = df.outcome == 'no' 

df.groupby('ID').sum() 
+0

您爲什麼認爲其他解決方案會導致過去,現在或將來的錯誤? –

+0

這是可以用任何語言工作的東西。在嘗試做更多pandonic素材時,我有過一些嚴重和微妙的錯誤 –

+0

@coldspeed這裏是它https://stackoverflow.com/questions/36337012/how-to-get-multiple-conditional-operations-after-a -pandas-groupby –

4

選項2
pd.factorize + np.bincount
這是令人費解的,痛苦......但速度非常快。

fi, ui = pd.factorize(df.ID.values) 
fo, uo = pd.factorize(df.outcome.values) 

n, m = ui.size, uo.size 
pd.DataFrame(
    np.bincount(fi * m + fo, minlength=n * m).reshape(n, m), 
    pd.Index(ui, name='ID'), pd.Index(uo, name='outcome') 
) 

outcome yes no 
ID    
1   3 0 
2   1 2 

選項C

pd.get_dummies(d.ID).T.dot(pd.get_dummies(d.outcome)) 

    no yes 
1 0 3 
2 2 1 

方案四

df.groupby(['ID', 'outcome']).size().unstack(fill_value=0) 
+0

謝謝!你的選擇C中的「T」是什麼意思? – Kay

+0

這意味着「糟糕」hahaha –

+1

@Kay轉置數據幀 – piRSquared