2017-06-13 129 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