Python Pandas Dataframe GroupBy Size 基于条件

Posted

技术标签:

【中文标题】Python Pandas Dataframe GroupBy Size 基于条件【英文标题】:Python Pandas Dataframe GroupBy Size based on condition 【发布时间】:2017-04-11 11:48:41 【问题描述】:

我有一个如下所示的数据框“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 选项。

【问题讨论】:

【参考方案1】:

可以先使用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)

【讨论】:

感谢您的时间安排。这是一种更好的方法。 感谢您的回答,第一个想法与您的回答非常相似。【参考方案2】:

你需要在两列上分组,然后申请检查date1是否等于date2

In [105]: df.groupby(['id', 'date1']).apply(lambda x: (x['date1'] == x['date2']).sum())
Out[105]:
id  date1
1   11/1/2016    2
    11/2/2016    1
2   11/1/2016    2
    11/2/2016    2
dtype: int64

【讨论】:

如果你对整个集合应用 lambda 函数并且你在 lambda 函数内部进行布尔比较,你会比 jezrael 慢。

以上是关于Python Pandas Dataframe GroupBy Size 基于条件的主要内容,如果未能解决你的问题,请参考以下文章

python pandas dataframe 写入hdfs

python数据分析之DataFrame内存优化

python数据分析之DataFrame内存优化

python:pandas之DataFrame取行列(df.loc(),df.iloc())以及索引

Python Pandas -- DataFrame

PYODBC 到 Pandas - DataFrame 不起作用 - 传递值的形状是(x,y),索引暗示(w,z)