Python Pandas Dataframe GroupBy Size 基于条件

标签 python pandas lambda size

我有一个如下所示的数据框“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 相等的每个实例,然后在每个相同日期为每个 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)

关于Python Pandas Dataframe GroupBy Size 基于条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40832728/

相关文章:

python - Pandas-合并两列(一列是列表,一列是字符串)

python - 使用元组作为 lambda 的参数会引发有关缺少所需位置参数的错误

python - 在 Django 中打印对象

python - 在 cloudControl 部署中调试 Django `collectstatic` 时出现问题

Python dataframe = 将列字符串中的值替换为另一个数据帧中的值

python - 如何解决类型错误: 'numpy.ndarray' object is not callable on Python

python - DataFrame Pandas 显示 NAN

c++ - 为什么在 C++ 中将较大函数中的某些功能编写为 lambda?

java - 如何每次使用列表中的不同值来应用使用 .map lambda 表达式的操作?

python - 一个包内的多个子包