我在学习一些功能,遇到这些。
df.groupby("date").agg("user_id": pd.Series.nunique)
和
df.groupby("date")["user_id"].transform('count')
我想了解和学习一下以上两种说法的区别。
谢谢
检查。
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
对于唯一值的计数,缺失的valeus被省略,所以对于第一组得到 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
也是counting错过了像unique value这样的值。
print (df.groupby("date")["user_id"].nunique())
date
2019-01-01 2
2019-01-02 2
Name: user_id, dtype: int64
看起来像个bug,因为。
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