2015-02-10 176 views
2

關於大熊貓據幀 'test_df' 後創建列:熊貓,GROUPBY

id_customer id_order product_name 
    3    78  product1 
    3    79  product2 
    3    80  product3 
    7    100  product4 
    9    109  product5 

上 'id_customer' 一個GROUPBY後怎麼可能得到:

id_customer order_1  order_2 product_name_1 product_name_2 
    3   78   79   product1   product2 
    7   100      product4  
    9   109      product5 

的目標是找回和2之間的最小線匹配GROUPBY之後的每個「id_customer」的數目,然後,如果可能的話,填充上述所有字段。

我開始與

def order_to_col(my_dataframe_df,my_list): 
    for num in range(0,min(len(my_list),2)): 
    my_dataframe_df['order_'+str(num)] = my_list[num] 

test_df = test_df.groupby('id_customer').apply(lambda x: order_to_col(test_df,list(x.id_order))) 

,但我不幹肯定它不是好辦法

+0

將會把信息轉換成列表是一個可以接受的選擇嗎? – Yojimbo 2015-02-10 18:40:33

+0

是@Yojimbo但完美的輸出將是新列 – woshitom 2015-02-10 18:49:34

回答

1

注:我建議使用頭要做到這一點,而不是使用多列:

In [11]: g = df.groupby('id_customer') 

In [12]: g.head(2) 
Out[12]: 
    id_customer id_order product_name 
0   3  78  product1 
1   3  79  product2 
3   7  100  product4 
4   9  109  product5 

可以使用第n合併0級和1,然後CONCAT這些:

In [21]: g = df.groupby('id_customer') 

In [22]: g[['id_order', 'product_name']].nth(0) 
Out[22]: 
      id_order product_name 
id_customer 
3     78  product1 
7     100  product4 
9     109  product5 

In [23]: g[['id_order', 'product_name']].nth(1) 
Out[23]: 
      id_order product_name 
id_customer 
3     79  product2 

In [24]: a = g[['id_order', 'product_name']].nth(0) 
     b = g[['id_order', 'product_name']].nth(1) 

In [25]: pd.concat([a, b], axis=1) 
Out[25]: 
      id_order product_name id_order product_name 
id_customer 
3     78  product1  79  product2 
7     100  product4  NaN   NaN 
9     109  product5  NaN   NaN