Python Groupby计数仅当某个值出现在表中的某一列中时

Python Groupby计数仅当某个值出现在表中的某一列中时,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个类似于下面提到的数据库的数据帧: +------------+-----+--------+ |时间| id |状态| +------------+-----+--------+ |1451606400 | id1 |是| |1451606400 | id1 |是| |1456790400 | id2 |编号| |1456790400 | id2 |是| |1456790400 | id2 |编号| +------------+-----+--------+ 我按照上面提到的所有列进行分

我有一个类似于下面提到的数据库的数据帧:

+------------+-----+--------+
|时间| id |状态|
+------------+-----+--------+
|1451606400 | id1 |是|
|1451606400 | id1 |是|
|1456790400 | id2 |编号|
|1456790400 | id2 |是|
|1456790400 | id2 |编号|
+------------+-----+--------+

我按照上面提到的所有列进行分组,并且我能够使用下面的命令成功地获得名为
'count'
的不同列中的计数:

df.groupby(['time','id','status']).size().reset_index(name='count')

但我只希望上述数据框中状态为“是”的行中的计数,其余应为“0”

期望输出:

+------------+-----+--------+---------+
|时间| id |状态|计数|
+------------+-----+--------+---------+
|1451606400 | id1 |是| 2|
|1456790400 | id2 |是| 1|
|1456790400 | id2 | No | 0|
+------------+-----+--------+---------+

我试图用以下代码计算
状态='Yes'

df[df['status']=='Yes'].groupby(['time','id','status']).size().reset_index(name='count')

这显然给了我那些状态为“是”的行,并丢弃了其余的行。我想要被丢弃的那些
count=0

有没有办法得到结果

提前谢谢

将lambda函数用于计数
sum
boolena
True
值过程,如
1

df1 = (df.groupby(['time','id','status'])
         .apply(lambda x: (x['status']== 'Yes').sum())
         .reset_index(name='count'))
或创建新列并聚合
sum

df1 = (df.assign(A=df['status']=='Yes')
         .groupby(['time','id','status'])['A']
         .sum()
         .astype(int)
         .reset_index(name='count'))
非常类似的解决方案,没有新列,但可读性稍差:

df1 = ((df['status']=='Yes')
        .groupby([df['time'],df['id'],df['status']])
        .sum()
        .astype(int)
        .reset_index(name='count'))

print (df)
         time   id status  count
0  1451606400  id1    Yes      2
1  1456790400  id2     No      0
2  1456790400  id2    Yes      1

如果您不介意稍微不同的输出格式,您可以:


结果是一种更有效的存储数据的方法,因为您不会在每个“是”/“否”类别的单独一行中重复索引。

Hey@jezrael,感谢您的回答。。。再来一次!:)我继续做第一个,它就像一个符咒。我会考虑其他的解决方案,如果第一个解决方案效果不好,我会尝试。@ManikanthaNekkalapudi-不客气!第二个解决方案在大数据帧中应该快一点。我无法在上面的解决方案中应用转换将结果推送到原始数据帧。具有上述条件的新列中的结果应位于原始数据帧中,而不是groupby生成的数据帧中。“有什么办法吗?”ManikanthaNekkalapudi-你能解释更多吗?是否需要原始列并通过输出数据创建新列?比如
df['new']=(df.assign(A=df['status']='Yes').groupby(['time','id','status'])['A']).transform('sum').astype(int.).reset_index(name='count'))
Yes,我想计算结果并将结果放回父数据帧。另外,我正在尝试上面的结果解决方案,但在父数据帧中没有得到正确的值。感谢您的回答!不幸的是,我不熟悉交叉表,但如果我找到任何需要的东西,我一定会留意这个答案。
df = pd.DataFrame({'time': [1451606400]*2 + [1456790400]*3,
                   'id': ['id1']*2 + ['id2']*3,
                   'status': ['Yes', 'Yes', 'No', 'Yes', 'No']})

res = pd.crosstab([df['time'], df['id']], df['status'])

print(res)

status          No  Yes
time       id          
1451606400 id1   0    2
1456790400 id2   2    1