2017-07-15 116 views
0

我有一個數據幀包含以下幾列:計算列,根據多行

  1. 活動在此事件發生
  2. 以前的事務ID

  • 事務ID想要添加一列來計算此事件是否發生在前一次交易中

    items = pd.DataFrame({'event':['A','B','B','A','C','C','C'], 
            'transaction_ID':[1,2,3,4,5,6,7], 
            'previous_trans':[2,3,5,7,4,1,6]}) 
    items["Same_Event_in_prev_trans"]=0 
    

    的 「Same_Event_in_prev_trans」 列的值應該是0 1 0 0 0 0 1

    我不知道該怎麼辦,沒有for循環。

    謝謝。

  • 回答

    2

    如何

    >> items['prev_event'] = pd.merge(items, items[['event', 'transaction_ID']], 
    >>        left_on='previous_trans', 
    >>        right_on='transaction_ID')['event_y'] 
    >> items['same_event'] = (items['event'] == items['prev_event']).astype(int) 
    
    2

    您可以使用lambda檢查前一個trans的事件。

    items["Same_Event_in_prev_trans"]=(
        items.apply(lambda x: 1 if x.event==items.set_index('transaction_ID') 
                  .loc[x.previous_trans,'event'] 
              else 0, axis=1) 
        ) 
    
    
    
    items 
    Out[239]: 
        event previous_trans transaction_ID Same_Event_in_prev_trans 
    0  A    2    1       0 
    1  B    3    2       1 
    2  B    5    3       0 
    3  A    7    4       0 
    4  C    4    5       0 
    5  C    1    6       0 
    6  C    6    7       1 
    
    2

    不完全確信邏輯,但檢查,如果每個事件的previous_transTRANSACTION_ID集內似乎得到所需的輸出:

    items["Same_Event_in_prev_trans"] = (items.groupby('event', group_keys=False) 
                .apply(lambda g: g.previous_trans.isin(g.transaction_ID)) 
                .astype(int)) 
    ​ 
    items 
    # event previous_trans transaction_ID Same_Event_in_prev_trans 
    #0  A    2    1      0 
    #1  B    3    2      1 
    #2  B    5    3      0 
    #3  A    7    4      0 
    #4  C    4    5      0 
    #5  C    1    6      0 
    #6  C    6    7      1