2015-12-15 45 views
4

我有一個數據框,包含四分之一季度(例如2015-Q4),customer_ID和已預訂的數量,以及許多其他列與現在無關。我想創建一個列,每個客戶第一次進行預訂。我試過這個:找到第一次在數據框中發生的值

alldata.sort_values(by=['Total_Apps_Reseller_Bookings_USD', 'Year_Quarter'], 
        ascending=[1, 1], 
        inplace=True) 
first_q = alldata[['Customer_ID', 'Year_Quarter']].groupby(by='Customer_ID').first() 

但我不確定它的工作。

另外,我還想另一個欄目告訴我在第一次預訂後有多少個房間預訂完成。我失敗了使用替換和字典,所以我用了一個合併。我創建預訂的每個季度,並從上述第一季度的數字ID,然後減去兩個:

q_booking_num = pd.DataFrame({'Year_Quarter': x, 'First_Quarter_id': np.arange(28)}) 

alldata = pd.merge(alldata, q_booking_num, on='Year_Quarter', how='outer') 
q_first_num = pd.DataFrame({'First_Quarter': x, 'First_Quarter_id': np.arange(28)}) 
alldata = pd.merge(alldata, q_first_num, on='First_Quarter', how='outer') 

這似乎並沒有有過一次合作,我看到的第一個季度「,是經過一些預訂已經完成。

回答

1

您需要指定要用於拍攝第一值列:

first_q = (alldata[['Customer_ID','Year_Quarter']] 
      .groupby(by='Customer_ID') 
      .Year_Quarter 
      .first() 
     ) 

下面是三位顧客一些樣本數據:

df = pd.DataFrame({'customer_ID': [1, 
            2, 2, 
            3, 3, 3], 
        'Year_Quarter': ['2010-Q1', 
            '2010-Q1', '2011-Q1', 
            '2010-Q1', '2011-Q1', '2012-Q1'], 
        'Total_Apps_Reseller_Bookings_USD': [1, 
                 2, 3, 
                 4, 5, 6]}) 

下面,我將文本轉換季度(例如「 2010-Q1')轉換爲數字等效值,方法是取第一個字符的整數值(df.Year_Quarter.str[:4].astype(int))。然後,我乘以四,並添加季度的價值。此值僅用於差分來確定自第一個訂單以來的總數。

接下來,我在groupby上使用transform來計算剛纔計算的這些小區的最小值。使用transform可使此值保持與原始數據幀相同的形狀。

然後我計算出quarters_since_first_order爲季度和第一季度之間的差額。

df['quarters'] = df.Year_Quarter.str[:4].astype(int) * 4 + df.Year_Quarter.str[-1].astype(int) 
first_order_quarter_no = df.groupby('customer_ID').quarters.transform(min) 
df['quarters_since_first_order'] = quarters - first_order_quarter_no 
del df['quarters'] # Clean-up. 

>>> df 
    Total_Apps_Reseller_Bookings_USD Year_Quarter customer_ID quarters_since_first_order 
0         1  2010-Q1   1       0 
1         2  2010-Q1   2       0 
2         3  2011-Q1   2       4 
3         4  2010-Q1   3       0 
4         5  2011-Q1   3       4 
5         6  2012-Q1   3       8 
0

對於第1部分:

我認爲你需要排序略有不同,以獲得您想要的結果:

alldata.sort_values(by=['Customer_ID', 'Year_Quarter', 
         'Total_Apps_Reseller_Bookings_USD'], 
        ascending=[1, 1],inplace=True) 
first_q = alldata[['Customer_ID','Year_Quarter']].groupby(by='Customer_ID').head(1) 

對於第2部分:

繼續關閉的第1部分,您可以將這些值重新合併到原始數據框中。此時,您可以編寫自定義函數來減去日期字符串,然後將其應用於每一行。

喜歡的東西:

def qt_sub(val, first): 
    year_dif = val[0:4] - first[0:4] 
    qt_dif = val[6] - first[6] 
    return 4 * int(year_dif) + int(qt_dif) 

alldata['diff_from_first'] = alldata.apply(lambda x: qt_sub(x['Year_Quarter'], 
                  x['First_Sale']), 
              axis=1) 
相關問題