Python pandas - 将groupby结果合并到原始数据帧

时间:2017-03-06 09:01:49

标签: python pandas group-by

我需要在df上运行自定义函数,并且我希望能够以与原始数据框中完全相同的顺序返回值向量(例如,合并回原始df然后使用新专栏)。

目前我的函数返回一个简单的列表,导致带有索引列的Series和包含该列表的另一列,见下文

如何将该结果反馈回df ??

其他一些信息:  1.我的功能包括一些业务逻辑,需要访问组中的所有colls,所以我无法使用transofrm  2.我尝试使用系列作为返回类型,但后来得到了typeerror seris.name必须是可清除的(即使我在返回之前设置了系列的名称)  3.我希望避免使用DataFrame作为该函数的结果

import pandas as pd
import random

df=pd.DataFrame({"x":[1,1,2,1,2,2,1,3,1,2,3,2],"y":[random.random() for _ in range(12)]})

def myfun(rs,rownum=0):
    if rownum >= len(rs): return []
    return [rs.y] + myfun(rs,rownum+1)

q=df.groupby(df.x).apply(myfun)

结果:

x
1    [[0.199527553305, 0.652730337948], [0.19952755...
2    [[0.58150463154, 0.882898367661], [0.581504631...
3    [[0.793173748785, 0.29465803134], [0.793173748...

更新:下面的脚本可以满足我的需求。我发现它工作的唯一方法是将索引值保存在原始记录集中,然后按该数字更新:

import pandas as pd
import random

df=pd.DataFrame({"x":[1,1,2,1,2,2,1,3,1,2,3,2],"y":[random.random() for _ in range(12)]})

def myfun(rs):
    def myfun_loop(rs,rownum=0,idx=[],val=[]):
        if rownum >= len(rs):
            return (idx,val)
        return myfun_loop(rs,rownum+1,idx+[rs.index[rownum]],val+[rownum])
    v=myfun_loop(rs)
    return pd.DataFrame({"idx":v[0],"val":v[1]})


g=df.groupby(df.x)
q=g.apply(lambda x:pd.DataFrame(myfun(x)))
q.set_index(["idx"],inplace=True)
df["val"]=None
df.update(q)

1 个答案:

答案 0 :(得分:0)

以下代码完成了您的工作,更简洁:

df["val"] = df.groupby(df.x).apply(
                lambda rs: pd.DataFrame(
                    {"idx": rs.index, 
                     "val": rs.reset_index().index})
            ).set_index(["idx"])

这样就不需要定义递归函数来实现这个功能。

相关问题