2017-01-28 16 views
1

У меня есть большая 2 мерная dataframe как это: дата, user_id, VAL1, val2Использование словаря для агрегации dataframe

Как мне нужно вычислять сложные функции для каждого user_id, я следующее:

for x in user_id_list : 
    dfi= df[ user_id= xx]  
    user_dict[x]['Newmycolname']= my_fun(dfi) 
    user_dict[x]['Newmycolname2']= my_fun2(dfi) 

# map the user_dict to df after 

Это не очень эффективный, но очень гибкий, поскольку я могу вычислить любой вид функции на sub-df (dfi). Кроме того, код может быть параллелен легко .... за счет того, чтобы быть быстро ...

Есть ли способ, чтобы заменить петлю для, по запросу панд grouby.agg и создание новых имен столбцов?

ответ

1

Да, вы можете использовать pandas.DataFrame.groupby и pandas.DataFrame.apply по каждой группе с преобразованием в pandas.Series:

>>> df.groupby('user_id') 
     .apply(lambda x: pd.Series(data=[my_fun(x), my_fun2(x)], index=['Newmycolname', 'Newmycolname2'])) 
     Newmycolname Newmycolname2 
user_id        
1     3.5   17.0 
2     6.0   20.0 

Без лямбда-функции, просто чтобы дать более четкое понимание того, что происходит:

>>> def worker(x): 
...  d = [my_fun(x), my_fun2(x)] 
...  i = ['Newmycolname', 'Newmycolname2'] 
...  return pd.Series(data=d, index=i) 
... 
>>> df.groupby('user_id').apply(worker) 
     Newmycolname Newmycolname2 
user_id        
1     3.5   17.0 
2     6.0   20.0 
+1

вы ответите сразу после Я сказал, что их вопрос путается ;-) – piRSquared

+0

@piRSquared спасибо, мне пришлось сначала обновить свои навыки pandas - к сожалению, я не трачу много времени на python в последнее время. –