2015-02-10 295 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