2017-06-13 106 views
2

我有一个熊猫数据框data具有下列交易数据:添加新列大熊猫数据帧生成NaN

  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() 

当我刚刚运行的语句,而不将其分配给数据框,我得到所需的输出熊猫系列。然而,上面的语句导致:

  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会导致NAs而不是计数值?

回答

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 
+0

感谢您的解释。 – TUSHAr

+0

关于如何使用lambda函数而不是nunique处理类似场景的任何指针? – TUSHAr

+1

'df ['noofvisits'] = df.groupby(['A'])['date']。transform(lambda x:do_something(x))' – EdChum