使用aggfunc = sum,Pandas Dataframes值计数在几列上

时间:2016-12-02 12:41:34

标签: python pandas dataframe

我有一个.csv数据集正确导入,清理,NA值根据需要等等。即(数据集要大得多 - 名称可能包含相同的名称和日期)

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

显示加班次数和长度。我需要实现的是人们在AM班次或PM班次加班的次数 例如(如上表所示)
上午班次有7个加班时间和下午3点。我不想知道谁,时间和原因 - 无所谓 我已经尝试了数据透视表,count,values_count等,每次我收到带有嵌套列标题的整个数据帧。 我应该使用额外的pyhton魔法并迭代每个DEP - 计算非NA值,然后将它们相加并按SHIFT分组?
我为问题的风格道歉,但熊猫文档有点模糊,我是这个主题的初学者 PS。到目前为止,我发现将数据集导入Excel更容易,并且在2分钟内我得到了我需要的答案:(。必须有更好的方法在熊猫中做到这一点:)

EDIT.1

每个方法都会返回一个包含NA值的计数... :(

EDIT.2

我已经解决了这个问题 - 为什么你的代码notnull()会丢弃NA但是在我的pandas中它实际上什么都不做(我得到的数据帧只有正值)...

1 个答案:

答案 0 :(得分:4)

您可以使用notnull创建掩码,然后使用groupby GroupBy.sumDataFrame.sumjeremycg GroupBy.count,<{3}}:

sum

另一个解决方案(感谢{{3}})与{{3}}:

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

您也可以先按子集选择,然后应用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