2013-08-28 2 views
0

Мне часто нужно вызвать groupby(). Apply(). Поскольку для функции обратного вызова apply() разрешено возвращать только Series или DataFrame (или, возможно, скаляр), становится довольно неудобно, если моя функция обратного вызова должна возвращать кортеж одномерных и двухмерных массивов, так как я буду иметь чтобы упаковать их в DataFrame, а затем распаковать в массивы, как только я получу результаты apply().pandas: сделать DataFrame из комбинации двухмерных и одномерных массивов

Пример:

def my_callback(g): 
"""This function takes the group g and calculates a two dim array and a 
one dim array""" 
    a = np.ones(len(g),2) 
    b = np.ones(len(g)) 
    #I need to return a and b 
    return a, b #this won't work 

x = data.groupby('key').apply(my_callback) 

Кто-нибудь есть какие-то предложения? Если pandas позволяют получить более гибкое возвращаемое значение из обратного вызова, это будет намного удобнее.

Теперь, чтобы увидеть несколько примеров использования, вот несколько примеров: Случай 1: Мне нужно преобразовать DataFrame в независимые и зависимые переменные регрессии. Преобразование включает в себя создание 2D-массива и 1D-массива по группам, а затем складывание строк массивов из каждой группы. Было бы замечательно, если бы только я могу написать:

X, Y = data.groupby('key').apply(my_callback) 

Использование DataFrame рода работ, но она включает в себя np.column_stack().

Случай 2: Я хочу преобразовать DataFrame в два массива разных строк и столбцов по группам. Я не думаю, что сегодня есть какой-то способ сделать это, если мы не будем кодировать все как 1D-серию.

+0

Что вы пытаетесь достичь здесь? Почему вы не можете сразу объединить результаты и распаковать? –

+0

Я бы сказал, что «более * неудобно, что вы хотите вернуть« кортеж »из операции« groupby ». –

+1

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

ответ

1

Вам не нужно использовать здесь заявку, и если вы не используете функцию cythonized, которая может работать с фреймом/серией, это не имеет никакого отношения к perf.

Итерации по самой группе, создавая список «вещей» (в этом случае кортеж, возвращаемый функцией обратного вызова). Затем вы можете продолжить процесс. Вы можете вернуть что-нибудь здесь (включая сгруппированный информационный кадр, если хотите)

[26]: df = DataFrame([['foo',1],['foo',2],['bar',3],['bar',4]],columns=list('AB')) 

In [27]: df 
Out[27]: 
    A B 
0 foo 1 
1 foo 2 
2 bar 3 
3 bar 4 

In [35]: def f(g, grp): 
    ....:  return (g, len(grp), grp['B'].sum()) 
    ....: 

In [36]: print [ f(g, grp) for g, grp in df.groupby('A') ] 
[('bar', 2, 7), ('foo', 2, 3)] 
Смежные вопросы