2017-03-06 2 views
0

df에서 사용자 지정 함수를 실행해야하며 원본 데이터 프레임과 동일한 순서로 벡터 값을 반환 할 수 있어야합니다 (예 : 원본 df로 다시 병합 한 다음 새 열만 사용).Python pandas - groupby 결과를 원래 데이터 프레임에 병합

인덱스 컬럼과 그 목록을 포함하는 다른 열이있는 시리즈 결과 내 기능은 간단한 목록을 반환하는 순간에서

, 나는 안양에 다시 그 결과를 결합 할 수있는 방법

아래를 참조하십시오?

일부 기타 정보 : 1. 내 기능은 일부 비즈니스 로직을 포함하고, 그룹의 모든 colls에 액세스해야, 그래서 내가 반환 형식으로 시리즈를 사용하여 시도하지만 형식 오류 seris있어 transofrm 2를 사용 할 수 없습니다. 이름은 (내가 반환 이전 시리즈의 이름을 설정 한 경우에도) 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

달성하려는 목표는 무엇입니까? 현재 함수는 "간단한 목록"이 아닌 동일한 계열의 목록을 반환합니다. GroupBy 객체에 적용하면 일련의 일련 목록이 제공됩니다 (type (q), type (q [1]), type (q [1] [0]))의 출력을 확인하십시오. 먼저 함수의 출력을 수정해야합니다. –

+0

작업 예제로 게시물을 업데이트했지만 구현이 꽤 추합니다. 더 좋은 방법이 있습니까? – dkone

답변

0

:

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

이렇게하면이 기능을 구현하기 위해 재귀 함수를 정의 할 필요가 없습니다.

+0

재귀는 실제로 여기서 옳지 않습니다. 복잡한 예제에서 코드를 복사하고 있습니다. 그래서 올바르게 이해하면 다른 사람의 df를 df에 할당하면 그 아래에 색인이 사용됩니다. 그게 내가 놓친 중요한 세부 사항 이었어! – dkone

관련 문제