id date1 date2
1 11/1/2016 11/1/2016
1 11/1/2016 11/2/2016
1 11/1/2016 11/1/2016
1 11/1/2016 11/2/2016
1 11/2/2016 11/2/2016
2 11/1/2016 11/1/2016
2 11/1/2016 11/2/2016
2 11/1/2016 11/1/2016
2 11/2/2016 11/2/2016
2 11/2/2016 11/2/2016
我想做的是将id分组,然后获取date1 = date2的每个id的大小.结果应如下所示:
id samedate count
1 11/1/2016 2
1 11/2/2016 1
2 11/1/2016 2
2 11/2/2016 2
我试过这个:
gb=df.groupby(id').apply(lambda x: x[x.date1== x.date2]['date1'].size())
并得到此错误:
TypeError: 'int' object is not callable
你当然可以标记date1和date2相等的每个实例,然后按每个samedate计算每个id的那些标志,但我必须相信有一个groupby选项.
解决方法:
您可以先使用boolean indexing
然后聚合size
:
df.date1 = pd.to_datetime(df.date1)
df.date2 = pd.to_datetime(df.date2)
df = df[df.date1 == df.date2]
gb=df.groupby(['id', 'date1']).size().reset_index(name='count')
print (gb)
id date1 count
0 1 2016-11-01 2
1 1 2016-11-02 1
2 2 2016-11-01 2
3 2 2016-11-02 2
时序:
In [79]: %timeit (df[df.date1 == df.date2].groupby(['id', 'date1']).size().reset_index(name='count'))
100 loops, best of 3: 3.84 ms per loop
In [80]: %timeit (df.groupby(['id', 'date1']).apply(lambda x: (x['date1'] == x['date2']).sum()).reset_index())
100 loops, best of 3: 7.57 ms per loop
时间代码:
#len df = 10k
df = pd.concat([df]*1000).reset_index(drop=True)
#print (df)
df.date1 = pd.to_datetime(df.date1)
df.date2 = pd.to_datetime(df.date2)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。