检查:
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