Pandas按多列分组统计特定字符串值的出现次数

8
我有一个类似这样的数据框:
dummy = pd.DataFrame([
('01/09/2020', 'TRUE', 'FALSE'),
('01/09/2020', 'TRUE', 'TRUE'),
('02/09/2020', 'FALSE', 'TRUE'),
('02/09/2020', 'TRUE', 'FALSE'),
('03/09/2020', 'FALSE', 'FALSE'),
('03/09/2020', 'TRUE', 'TRUE'),
('03/09/2020', 'TRUE', 'FALSE')], columns=['date', 'Action1', 'Action2'])

在此输入图片描述

现在我想要每天“TRUE”操作的聚合,应该是这样的:
在此输入图片描述

我尝试过使用分组、求和、计数等方式,但是对于需要聚合多个列的情况,这些方法都不管用。我不想将表格拆分成多个数据框并单独解决,然后再合并到一个数据框中,请问有什么聪明的方法可以做到吗?


TRUE和FALSE是字符串还是可以是布尔值? - Kenan
目前它只是字符串,因为数据收集器在其中放置了一些非布尔值,所以无法更改为布尔类型。 - Vineet
不要选择我的答案。Quang Hoang和Vaishali的答案更好。如果你不改变这个,这会让我很烦恼。 - piRSquared
我通常更喜欢使用.resample,因为我们可以将聚合更改为任何时间段。 - Prayson W. Daniel
6个回答

7

您虚拟数据框中的True和False是字符串,您可以将它们转换为整数并求和

dummy.replace({'TRUE':1,'FALSE':0}).groupby('date',as_index = False).sum()

    date        Action1 Action2
0   01/09/2020  2       1
1   02/09/2020  1       1
2   03/09/2020  2       1

1
OP,请你使用这种更为合理的方式来替换 'TRUE'/'FALSE' 字符串!(-: - piRSquared

5
你也可以尝试:
dummy.set_index(['date']).eq('TRUE').sum(level='date')

输出:

            Action1  Action2
date                        
01/09/2020        2        1
02/09/2020        1        1
03/09/2020        2        1

4
任何看到这个答案的人都应该查看@QuangHoang@Vaishali的答案
它们是更好的答案。我无法控制OP选择什么,但你应该给那些答案点赞。

@QuangHoang启发

dummy.iloc[:, 1:].eq('TRUE').groupby(dummy.date).sum()

            Action1  Action2
date                        
01/09/2020        2        1
02/09/2020        1        1
03/09/2020        2        1

将您的数据框修复,使其具有实际的True/False值。
from ast import literal_eval

dummy = dummy.assign(**dummy[['Action1', 'Action2']].applymap(str.title).applymap(literal_eval))

然后使用 groupby
dummy.groupby('date').sum()

            Action1  Action2
date                        
01/09/2020        2        1
02/09/2020        1        1
03/09/2020        2        1

1
您可以使用数据透视表:
dummy.pivot_table(index='date', values=['Action1', 'Action2'], 
                  aggfunc=lambda x: (x=='TRUE').sum()).reset_index()

输出:

          date  Action1 Action2
0   01/09/2020        2       1
1   02/09/2020        1       1
2   03/09/2020        2       1

1
In [7]: dummy
Out[7]:
         date Action1 Action2
0  01/09/2020    TRUE   FALSE
1  01/09/2020    TRUE    TRUE
2  02/09/2020   FALSE    TRUE
3  02/09/2020    TRUE   FALSE
4  03/09/2020   FALSE   FALSE
5  03/09/2020    TRUE    TRUE
6  03/09/2020    TRUE   FALSE


In [9]: dummy.groupby(['date'], as_index=False).agg(lambda x: x.eq('TRUE').sum())
Out[9]:
         date  Action1  Action2
0  01/09/2020        2        1
1  02/09/2020        1        1
2  03/09/2020        2        1

1
在类似的路径上使用 .resample
...
dummy['date'] = pd.to_datetime(dummy['date'], dayfirst=True)
dummy[['Action1', 'Action2']] = dummy[['Action1', 'Action2']].replace({'TRUE':True, 'FALSE': False})

# set date to index
dummy.set_index('date', inplace=True)

dummy.resample('1D').sum()

请参阅重新采样文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接