2016-04-05 3 views
2

У меня есть pandas датафрейм, в котором есть столбец, где данные представляют собой список статистических данных, вычисленных из операции groupby.создать новые столбцы из списка столбцов в pandas

df = pd.DataFrame({'a':[1,1,1,2,2,2,3], 'b':[3,4,2,3,4,3,2]}) 
def calculate_stuff(x): 
    return len(x)/5, sum(x)/len(x), sum(x) 
>>> df.groupby('a').apply(lambda row : calculate_stuff(row.b)) 
a 
1    (0, 3, 9) 
2    (0, 3, 10) 
3    (0, 2, 2) 
dtype: object 

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

a col1 col2 col3 
1 0  3  9 
2 0  3  10 
3 0  2  2 

Я не думаю, что я могу использовать df.groupby('a').agg, потому что один из расчетов не требуется для других расчетов. Какие-либо предложения?

редактировать: Я понял мои агрегатные функции в моем примере не агрегатные функции, поэтому я изменил их

ответ

2

Добавление дополнительного a элемент категории поэтому результат 4x3 ,

df = pd.DataFrame({'a': [1, 1, 1, 2, 2, 2, 3, 4], 
        'b': [3, 4, 2, 3, 4, 3, 2, 1]}) 

new_cols = ['col1', 'col2', 'col3'] 

gb = df.groupby('a').apply(lambda group: calculate_stuff(group.b)) 

>>> pd.DataFrame(zip(*gb), columns=gb.index, index=new_cols).T 
    col1 col2 col3 
a     
1  0  3  9 
2  0  3 10 
3  0  2  2 
4  0  1  1 
+0

Это прекрасно работает. Я сделал редактирование, чтобы индекс поддерживался из исходной группы данных. – mnky9800n

+0

Хммм, я не понимаю, почему вывод отличается по желанию. Может быть, вопрос может быть изменен или мне что-то не хватает? – jezrael

1

Вы можете попробовать list понимание:

import pandas as pd 

df = pd.DataFrame({'a':[1,1,1,2,2,2,3], 'b':[3,4,2,3,4,3,2]}) 

def calculate_stuff(x): 
    return len(x)/5, sum(x)/len(x), sum(x) 

group_df = df.groupby('a').apply(lambda row : calculate_stuff(row.b)) 

print pd.DataFrame([x for x in group_df], 
        columns=['col1','col2','col3'], 
        index=group_df.index) 

    col1 col2 col3 
a     
1  0  3  9 
2  0  3 10 
3  0  2  2 
Смежные вопросы