向 Pandas DataFrame 添加新列导致 NaN

tus*_*haR 5 python pandas-groupby

我有一个data包含以下交易数据的Pandas DataFrame :

           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
Run Code Online (Sandbox Code Playgroud)

我想要一个新列,其中包含每个消费者的访问次数(每天多次访问应视为 1)。

所以我试过这个:

import pandas as pd
data['noofvisits'] = data.groupby(['A'])['date'].nunique()
Run Code Online (Sandbox Code Playgroud)

当我只运行该语句而不将其分配给 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
Run Code Online (Sandbox Code Playgroud)

预期的输出是:

           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
Run Code Online (Sandbox Code Playgroud)

这种方法有什么问题?为什么 noofvisits 列的结果是 NAs 而不是计数值?

EdC*_*ica 6

使用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
Run Code Online (Sandbox Code Playgroud)

直接分配的问题是您group在列上,'A'因此这成为groupby聚合的索引,然后您尝试分配给您的 df 但索引不一致,因此NaN列值。

此外,即使索引值确实同意,形状也不同:

In[33]:
df.groupby(['A'])['date'].nunique()

Out[33]: 
A
M000511    1
M000833    2
Name: date, dtype: int64
Run Code Online (Sandbox Code Playgroud)