Питоны Панды, применяя функцию к объектам GroupBy «индексы» - PullRequest
0 голосов
/ 03 июля 2018

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

У меня есть датафрейм с такими столбцами, как

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

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

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

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. Но я не знаю, как получить доступ к панели, используя метод transform для объектов Groupby.

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

1 Ответ

0 голосов
/ 03 июля 2018

Я думаю, что нужно 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)

Sample

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...