向pandas DataFrame添加新列会导致NaN

时间:2017-06-13 09:22:24

标签: python pandas-groupby

我有一个带有以下交易数据的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而不是计数值?

1 个答案:

答案 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