Я уверен, что есть лучшее решение моей текущей проблемы в 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.
Спасибо за вашу помощь
Я думаю, что нужно 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