我需要在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)
答案 0 :(得分:0)
以下代码完成了您的工作,更简洁:
df["val"] = df.groupby(df.x).apply(
lambda rs: pd.DataFrame(
{"idx": rs.index,
"val": rs.reset_index().index})
).set_index(["idx"])
这样就不需要定义递归函数来实现这个功能。