2015-12-21 32 views
1

我需要.groupby()使用customer,然後爲客戶進行首次購買的日期添加一列,併爲相應的購買添加另一列量。將數據按一列分組,然後從其他兩列中選擇第一個出現

這是我的代碼。我做的第一部分是錯的,不知道如何做第二部分。我試過.loc.idxmin ....

mydata = [{'amount': 3200, 'close_date':'2013-03-31', 'customer': 'Customer 1',}, 
      {'amount': 1430, 'close_date':'2013-11-30', 'customer': 'Customer 1',}, 
      {'amount': 4320, 'close_date':'2014-03-31', 'customer': 'Customer 2',}, 
      {'amount': 2340, 'close_date':'2015-05-18', 'customer': 'Customer 2',}, 
      {'amount': 4320, 'close_date':'2015-06-29', 'customer': 'Customer 2',},] 

df = pd.DataFrame(mydata) 
df.close_date = pd.to_datetime(df.close_date) 
df['first_date'] = df.groupby('customer')['close_date'].min().apply(lambda x: x.strftime('%Y-%m')) 
+0

groupby語句的結果是另一個有兩列的數據框 - 「customer」和第一個日期。您不能將其分配給原始數據框的列。您是否嘗試創建一個新的數據框,其中包含有關每位客戶的信息以及他們的首次購買和購買金額?或者您是否試圖將該信息添加到原始數據框? – LateCoder

+0

對不起,它實際上是一個Series對象,而不是一個數據框。 – LateCoder

+0

LaterCoder,我試圖添加幾列到原始數據框,但我可以做一個單獨的DF。基本上,我試圖找到第一個購買日期和當天的購買金額。我需要的只是一個包含該信息的數據框,而不管它是否是原始信息。謝謝! –

回答

3

如果通過close_date您的數據進行排序,你可以做如下:

df.sort_values('close_date').groupby(['customer'])['close_date', 'amount'].first() 

      close_date amount 
customer      
Customer 1 2013-03-31 3200 
Customer 2 2014-03-31 4320 

.sort_values()0.17增加了,以前是sort()(see docs)

+1

可能要注意的是,這需要對數據進行排序。 – TomAugspurger

+0

這是正確的,已更新。 – Stefan

+0

我得到這個錯誤:'AttributeError:'DataFrame'對象沒有'sort_values''的屬性 –

0

兩個步驟。

一是第一次購買的日:

In [34]: first = df.groupby('customer').close_date.min() 

In [35]: first 
Out[35]: 
customer 
Customer 1 2013-03-31 
Customer 2 2014-03-31 
Name: close_date, dtype: object 

我們將首先使用作爲一個索引,

In [36]: idx = pd.MultiIndex.from_tuples(list(first.iteritems()), names=['customer', 'close_date']) 

In [37]: idx 
Out[37]: 
MultiIndex(levels=[['Customer 1', 'Customer 2'], ['2013-03-31', '2014-03-31']], 
      labels=[[0, 1], [0, 1]]) 

對於與這兩個級別

In [38]: df2 = df.set_index(['customer', 'close_date']) 

In [39]: df2.loc[idx] 
Out[39]:      
         amount 
customer close_date 
Customer 1 2013-03-31 3200 
Customer 2 2014-03-31 4320 

這是一個數據幀一個系列,你可以使用.unstack()找回DataFrame。