Pythons Pandas,在GroupBy对象“索引”上应用功能

时间:2018-07-03 08:58:27

标签: python pandas pandas-groupby

我确信有一个更好的解决方案可以解决我目前在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。

感谢您的帮助

1 个答案:

答案 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