2015-02-27 3 views
0

У меня есть следующие панды DataFrame 'df1':Python, Панды ошибка с GroupBy

id_client    product 
client1     product1 
client1     product4 
client1     product5 
client2     product1 
client2     product6 
client3     product1 

Прежде всего я хочу GroupBy id_client и получит соответствующие продукты внутри списка:

id_client    product 
client1    [product1,product4,product5] 
client2    [product1,product6] 
client3    [product1] 

Тогда для каждый элемент каждого списка Я хочу добавить новую строку в новый DataFrame 'df2', подобный этому (nb_product - длина каждого списка):

product   nb_product 
product1   3 
product4   3 
product5   3 
product1   2 
product6   2 
product1   1 

Так первый я создал новый словарь:

nb_of_combination = {} 
nb_of_combination['product'] = [] 
nb_of_combination['nb_product'] = [] 

я объявил следующую функцию:

def nb_of_combination(my_list): 
    nb_comb = len(my_list) 
    for row in my_list: 
    nb_of_combination['product'].append(row) 
    nb_of_combination['nb_product'].append(nb_comb) 

я сгруппированный по «df1» по полю «id_client» и я применяю функция 'nb_of_combination':

df1 = df1.groupby('id_client',as_index=False).apply(lambda x: nb_of_combination(list(x.product))) 

Но я получаю следующее сообщение об ошибке:

df1 = df1.groupby('id_client',as_index=False).apply(lambda x: nb_of_combination(list(x.product))) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 660, in apply 
    return self._python_apply_general(f) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 667, in _python_apply_general 
    not_indexed_same=mutated) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 2821, in _wrap_applied_output 
    v = next(v for v in values if v is not None) 

Что я действительно не понимаю, так как:

df2 = pd.DataFrame(nb_of_combination) 

кажется, работает хорошо.

ответ

1

Ваш метод слишком сложный, вы можете достичь того, чего хотите, вызывая transform и передавая функцию count и присваивая это обратно исходному df в качестве нового столбца. transform возвращает последовательность, выровненную к исходному df, см. docs:

In [89]: 

df['nb_product'] = df.groupby('id_client').transform(pd.Series.count) 
df 

Out[89]: 
    id_client product nb_product 
0 client1 product1   3 
1 client1 product4   3 
2 client1 product5   3 
3 client2 product1   2 
4 client2 product6   2 
5 client3 product1   1 
Смежные вопросы