2016-12-02 97 views
1

我有一個.CSV數據集導入正確,清理,NA值的要求等。即(數據集是更大的名稱可能包含相同的名稱以及日期)熊貓數據框的值計數在幾列與aggfunc =總和

NAME SHIFT DEP1 DEP2 DEP3 DAY 
COLLINS AM  1  1  0.5 01/02/2016 
JOHNS PM  0.5 NA 0.5 02/02/2016 
SMITH AM  1  0.5 NA 01/02/2016 
RUBBER AM  NA 1.5 1  03/02/2016 
COLLINS PM  NA 1  NA 02/02/2016 

它顯示加班次數和它的長度。我需要做的是統計所有部門人員在上午班次或下午班次上加班的次數。
因此,例如(如上表所示)
上午班次有7個加班和下午3點。我不想知道誰,何時和爲什麼 - 無所謂。
我已經嘗試了數據透視表,計數,values_count等,每次我收到與嵌套列標題整個數據幀。 我是否應該使用額外的pyhton魔術並迭代每個DEP - 計算非NA值,然後將它們彙總並按SHIFT進行分組?
我很抱歉的問題的風格,但熊貓文檔有點模糊,我在這個主題的初學者 PS。到目前爲止,我已經找到了更容易導入數據集到Excel並在2分鐘之內,我得到我所需要的:(答案。必須有一個更好的方式在大熊貓做到這一點:)

EDIT.1

的這些方法每次返回的計數包括NA值... :(

EDIT.2

我已經分離的問題 - 爲什麼你的代碼notnull()下降NA但在我的大熊貓,它確實什麼都不做(我只有TRUE值的數據幀)...

回答

4

可以使用notnull與雙sum首先創建面膜,然後groupbyGroupBy.sum和第二是DataFrame.sum

print (df[['DEP1','DEP2','DEP3' ]].notnull()) 
    DEP1 DEP2 DEP3 
0 True True True 
1 True False True 
2 True True False 
3 False True True 
4 False True False 

print (df[['DEP1','DEP2','DEP3' ]].notnull().groupby([df.SHIFT]).sum()) 
     DEP1 DEP2 DEP3 
SHIFT     
AM  2.0 3.0 2.0 
PM  1.0 1.0 1.0 

df = df[['DEP1','DEP2','DEP3' ]].notnull().groupby([df.SHIFT]).sum().sum(axis=1) 
print (df) 
SHIFT 
AM 7.0 
PM 3.0 
dtype: float64 

另一種解決方案(感謝jeremycg)與GroupBy.count

print (df.groupby('SHIFT')[['DEP1', 'DEP2','DEP3']].count()) 
     DEP1 DEP2 DEP3 
SHIFT     
AM  2  3  2 
PM  1  1  1 

df = df.groupby('SHIFT')[['DEP1', 'DEP2','DEP3']].count().sum(axis=1) 
print (df) 
SHIFT 
AM 7 
PM 3 
dtype: int64 

您也可以先選擇然後再應用count

print (df[['DEP1','DEP2','DEP3' ]].groupby([df.SHIFT]).count()) 
     DEP1 DEP2 DEP3 
SHIFT     
AM  2  3  2 
PM  1  1  1 

df = df[['DEP1','DEP2','DEP3' ]].groupby([df.SHIFT]).count().sum(axis=1) 
print (df) 
SHIFT 
AM 7 
PM 3 
dtype: int64 
+1

您可以使用.count來避免使用mask - 'df.groupby('SHIFT')[[''DEP1','DEP2','DEP3']]。count()。sum(1)' – jeremycg

+0

謝謝,我添加它來回答。 – jezrael

+0

@jezrael你可以解釋爲什麼一個雙重的總和? –