首页 > 解决方案 > Python - 每个日期和月份 PANDAS 的所有非零列的计数

问题描述

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

    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

提前致谢

标签: pythonpandasdataframe

解决方案


groupbyagg和一起使用numpy.count_nonzero

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 创建布尔掩码ne,转换为整数和聚合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

推荐阅读