Python Pandas Dataframe GroupBy基于条件的大小

clg4

我有一个数据框“ df”,看起来像这样:

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进行分组,然后获取每个ID的大小,其中date1 = date2。结果应如下所示:

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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章