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)
달성하려는 목표는 무엇입니까? 현재 함수는 "간단한 목록"이 아닌 동일한 계열의 목록을 반환합니다. GroupBy 객체에 적용하면 일련의 일련 목록이 제공됩니다 (type (q), type (q [1]), type (q [1] [0]))의 출력을 확인하십시오. 먼저 함수의 출력을 수정해야합니다. –
작업 예제로 게시물을 업데이트했지만 구현이 꽤 추합니다. 더 좋은 방법이 있습니까? – dkone