Pandas Groupby 仅针对特定字符串值计算多列

Vin*_*eet 8 python pandas

我有一个这样的数据框

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'])
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

现在我想要每天汇总 'TRUE' 动作,它应该看起来像
在此处输入图片说明

我应用了 group by、sum 和 count 等,但没有任何效果对我有用,因为我必须聚合多个列,而且我不想将表拆分为多个数据框并单独解析并合并为一个,有人可以提出建议吗聪明的方法来做到这一点。

Vai*_*ali 7

虚拟 df 中的 True 和 False 是字符串,您可以将它们转换为 int 和 sum

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
Run Code Online (Sandbox Code Playgroud)


Qua*_*ang 5

你也可以试试:

dummy.set_index(['date']).eq('TRUE').sum(level='date')
Run Code Online (Sandbox Code Playgroud)

输出:

            Action1  Action2
date                        
01/09/2020        2        1
02/09/2020        1        1
03/09/2020        2        1
Run Code Online (Sandbox Code Playgroud)


piR*_*red 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
Run Code Online (Sandbox Code Playgroud)

旧答案

修复您的数据框,使其具有实际True/False

from ast import literal_eval

dummy = dummy.assign(**dummy[['Action1', 'Action2']].applymap(str.title).applymap(literal_eval))
Run Code Online (Sandbox Code Playgroud)

然后使用groupby

dummy.groupby('date').sum()

            Action1  Action2
date                        
01/09/2020        2        1
02/09/2020        1        1
03/09/2020        2        1
Run Code Online (Sandbox Code Playgroud)