每个日期和月份的所有非零列的Python计数

2024-09-26 22:45:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个数据帧,我想要每个月、每个日期和每个电子邮件的所有非零值的计数

    DATE    LOC      EMAIL         INTERATION
    1/11    INDIA    qw@mail.com     0
    1/11    INDIA    ap@mail.com     11
    1/11    LONDON   az@mail.com     2
    2/11    INDIA    qw@mail.com     5
    2/11    INDIA    rw@mail.com     5
    2/11    LONDON   az@mail.com     0
    3/11    LONDON   az@mail.com     1

因此,生成的数据帧应该如下所示:

    DATE    LOC        INTERATION
    1/11    INDIA         1
    1/11    LONDON        1
    2/11    INDIA         2
    2/11    LONDON        0
    3/11    LONDON        1

提前谢谢


Tags: 数据comdate电子邮件emailmaillocaz
2条回答

^{}^{}^{}一起使用:

df1 = df.groupby(['DATE','LOC'], as_index=False)['INTERATION'].agg(np.count_nonzero)
print (df1)
   DATE     LOC  INTERATION
0  1/11   INDIA           1
1  1/11  LONDON           1
2  2/11   INDIA           2
3  2/11  LONDON           0
4  3/11  LONDON           1

另一种解决方案是通过compre by not equal by ^{}、cast to integers和aggregate sum创建布尔掩码:

df1 = (df.assign(INTERATION = df['INTERATION'].ne(0).astype(int))
       .groupby(['DATE','LOC'], as_index=False)['INTERATION']
       .sum())

如果需要也按列分组EMAIL

df2 = df.groupby(['DATE','LOC','EMAIL'], as_index=False)['INTERATION'].agg(np.count_nonzero)
print (df2)
   DATE     LOC        EMAIL  INTERATION
0  1/11   INDIA  ap@mail.com           1
1  1/11   INDIA  qw@mail.com           0
2  1/11  LONDON  az@mail.com           1
3  2/11   INDIA  qw@mail.com           1
4  2/11   INDIA  rw@mail.com           1
5  2/11  LONDON  az@mail.com           0
6  3/11  LONDON  az@mail.com           1

一种不一定有效的解决方案是先转换为bool,然后再转换为sum。在计算中,0/1分别等效于False/True

res = df.groupby(['DATE', 'LOC'])['INTERATION']\
        .apply(lambda x: x.astype(bool).sum()).reset_index()

print(res)

   DATE     LOC  INTERATION
0  1/11   INDIA           1
1  1/11  LONDON           1
2  2/11   INDIA           2
3  2/11  LONDON           0
4  3/11  LONDON           1

相关问题 更多 >

    热门问题