【问题标题】:Difference between two functions in groupby [duplicate]groupby中两个函数之间的区别[重复]
【发布时间】:2020-08-30 22:38:44
【问题描述】:

我在学习一些函数时遇到了这些:

df.groupby("date").agg("user_id": pd.Series.nunique)

df.groupby("date")["user_id"].transform('count')

我想了解和了解以上两种说法的区别。

谢谢!

【问题讨论】:

  • 比较你得到的结果,你会发现不同

标签: python pandas dataframe group-by aggregate


【解决方案1】:

检查:

df = pd.DataFrame({
        'date':['2019-01-01', '2019-01-01', '2019-01-01', 
                '2019-01-02', '2019-01-02', '2019-01-02'],
         'user_id':[np.nan,4,4,5,5,4],

})

print (df)
         date  user_id
0  2019-01-01      NaN
1  2019-01-01      4.0
2  2019-01-01      4.0
3  2019-01-02      5.0
4  2019-01-02      5.0
5  2019-01-02      4.0

这里的第一个区别是使用聚合,通过一些聚合函数减少行。这里使用Series.nunique 计算唯一值的个数,省略缺失值,因此第一组获取1,第二组获取2

print (df.groupby("date").agg({"user_id": pd.Series.nunique}))
            user_id
date               
2019-01-01      1.0
2019-01-02      2.0

如果使用DataFrameGroupBy.nunique 也是计数missinf 值,如唯一值:

print (df.groupby("date")["user_id"].nunique())
date
2019-01-01    2
2019-01-02    2
Name: user_id, dtype: int64

看起来像错误,因为:

print (df.groupby("date")["user_id"].nunique(dropna=True))
date
2019-01-01    2
2019-01-02    2
Name: user_id, dtype: int64

print (df.groupby("date")["user_id"].nunique(dropna=False))
date
2019-01-01    2
2019-01-02    2
Name: user_id, dtype: int64

如果使用GroupBy.transform,则应用聚合函数,但不会减少行,但相同组会重复相同的值,因此获得与原始长度相同的新Series

还有GroupBy.count id 用于计算排除缺失值的值的数量,因此第一组获取2,第二组获取3,因为没有缺失值:

print (df.groupby("date")["user_id"].transform('count'))
0    2
1    2
2    2
3    3
4    3
5    3
Name: user_id, dtype: int64

【讨论】:

  • 很好的解释@jezrael,我怎么能用distinct countprint (df.groupby("date")["user_id"].transform('count'))
  • @omdurg - 你觉得print (df.groupby("date")["user_id"].transform('nunique')) 吗?
猜你喜欢
  • 2013-10-07
  • 2017-12-04
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 2020-03-05
相关资源
最近更新 更多