我有一个带有以下交易数据的pandas DataFrame data
:
A date
0 M000833 2016-08-01
1 M000833 2016-08-01
2 M000833 2016-08-02
3 M000833 2016-08-02
4 M000511 2016-08-05
我希望每个消费者都有一个新列,其中包含访问次数(每天多次访问次数应被视为1次)。
所以我尝试了这个:
import pandas as pd
data['noofvisits'] = data.groupby(['A'])['date'].nunique()
当我只运行语句而不将其分配给DataFrame时,我得到了一个带有所需输出的pandas系列。但是,上述声明导致:
A date noofvisits
0 M000833 2016-08-01 NaN
1 M000833 2016-08-01 NaN
2 M000833 2016-08-02 NaN
3 M000833 2016-08-02 NaN
4 M000511 2016-08-05 NaN
预期输出为:
A date noofvisits
0 M000833 2016-08-01 2
1 M000833 2016-08-01 2
2 M000833 2016-08-02 2
3 M000833 2016-08-02 2
4 M000511 2016-08-05 1
这种方法有什么问题?为什么列noofvisits导致NA而不是计数值?
答案 0 :(得分:3)
使用transform
生成Series
,其索引与原始df对齐:
In[32]:
df['noofvisits'] = df.groupby(['A'])['date'].transform('nunique')
df
Out[32]:
A date noofvisits
index
0 M000833 2016-08-01 2
1 M000833 2016-08-01 2
2 M000833 2016-08-02 2
3 M000833 2016-08-02 2
4 M000511 2016-08-05 1
直接分配的问题是你group
在'A'
列上,所以这成为groupby
聚合的索引,然后尝试分配给你的df但是索引不同意NaN
列值。
即使指数值确实同意,形状也是不同的:
In[33]:
df.groupby(['A'])['date'].nunique()
Out[33]:
A
M000511 1
M000833 2
Name: date, dtype: int64