Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—每个日期和月份的所有非零列的计数_Python_Pandas_Dataframe - Fatal编程技术网

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

Python—每个日期和月份的所有非零列的计数,python,pandas,dataframe,Python,Pandas,Dataframe,我有这个数据框,我想要每个月、每个日期和每个电子邮件的所有非零值的计数 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

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

    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
提前感谢

与和一起使用:

另一种解决方案是通过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())
如果还需要按列分组
电子邮件

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

你一个人试了什么?我看这里没有问题,只是一个命令。请参阅并感谢您,第一个解决方案非常容易理解
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