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和aggregatesum
创建布尔掩码:
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