我有一个.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中它实际上什么都不做(我得到的数据帧只有正值)...
答案 0 :(得分:4)
您可以使用notnull
创建掩码,然后使用groupby
GroupBy.sum
,DataFrame.sum
,jeremycg ,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