我确信有一个更好的解决方案可以解决我目前在Pandas中遇到的问题:
我有一个带有类似列的数据框
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更少冗余的东西。但是我不使用Groupby对象的tranform方法访问bar,foo。
感谢您的帮助
答案 0 :(得分: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