Питоны Панды, применяя функцию к объектам «индексы» объекта GroupBy

1

Я уверен, что есть лучшее решение моей текущей проблемы в Pandas:

У меня есть Dataframe с такими столбцами, как

df.columns = ['bar','foo',0,1,2]

Я хочу вызвать базу данных SQL, где я фильтрую с кортежем значений bar и foo, вычислить что-то с возвращаемым результатом с использованием столбцов 0 и 1 и вернуть результат в столбец 3.

На данный момент я делаю это с группой, и нигде не нашел подходящего способа использования метода преобразования после этого.

groups = df.groupby('bar','foo')
for (bar,foo), group in groups:
  db_results = read_db(bar,foo)
  df[3].loc(groups.groups((bar,foo))) = f(db_results,df[0].loc(...),df[1].loc(...))

Я считаю, что это немного уродливо, не так ли? Там должно быть что-то большее с меньшей редуальностью, чем df.loc во всем мире. Но я не могу получить доступ к бару, используя метод tranform объектов Groupby.

Спасибо за вашу помощь

Теги:
pandas
pandas-groupby

1 ответ

1
Лучший ответ

Я думаю, что нужно GroupBy.apply с пользовательской функцией:

def func(x):
     db_results = read_db(x.name[0],x.name[1])
     x[3] = f(db_results, x[0], x[1])
     return x

df = df.groupby(['bar','foo']).apply(func)

Образец:

df = pd.DataFrame({0:list('abcdef'),
                   'foo':[4,5,4,5,5,4],
                   1:[7,8,9,4,2,3],
                   2:[1,3,5,7,1,0],
                   'bar':list('aaabbb')}, columns=['bar','foo',0,1,2])
print (df)
  bar  foo  0  1  2
0   a    4  a  7  1
1   a    5  b  8  3
2   a    4  c  9  5
3   b    5  d  4  7
4   b    5  e  2  1
5   b    4  f  3  0

def func(x):
    print (x.name[0])
    x[3] = (x[2] + x[1]) * x.name[1]
    return x

df = df.groupby(['bar','foo']).apply(func)
print (df)
  bar  foo  0  1  2   3
0   a    4  a  7  1  32
1   a    5  b  8  3  55
2   a    4  c  9  5  56
3   b    5  d  4  7  55
4   b    5  e  2  1  15
5   b    4  f  3  0  12

Ещё вопросы

Сообщество Overcoder
Наверх
Меню