목표는 DataFrame 개체를 가져 와서 그룹별로 계산하는 여러 열을 추가하는 것입니다. 그러나이 계산은 직관적으로 벡터화 할 수 없습니다 (if 문과 누적 합계가 포함됨).복수 열 출력이있는 DataFrame GroupBy
나는 보이는 코드를 실행하는 것 인 R data.table 배경에서오고 같은 :
DT[,c('newcol1','newcol2'):=f(.SD),by=groupvar]
-data.table 하위 groupvar가 그룹화 변수이며, 함수 f가에 소요
(그룹으로 나누어) 그룹의 길이와 동일한 길이의 두 배열을 가진 목록을 반환합니다. 이 경우 할당의 부작용 : = newcol1과 newcol2라는 두 개의 새 열을 원래의 data.table DT에 추가합니다.
팬더 문서를 사용해 보았지만이 작업을 복제하는 방법이 아직 불분명합니다 (예 : 내 함수 f가 DataFrames를 반환하거나 시리즈를 사용해야하는 경우).
여기에 내 초기 DF입니다 :
import pandas as pd
df=pd.DataFrame({'id': [1, 1, 1, 1, 2, 2, 2, 2],'time':[1,2,3,4,1,2,3,4],'choice':['a','a','b','a','b','b','b','b']})
내가 두 개의 열 'A'와 'B'에 추가 할 것 같은 그들은 해당 ID에 의해 선택 'A'또는 'B'의 누적 수를 센다 그 기간 이전에 나는 대략 그룹별로 올바른 작업을 수행하는 기능을 작성했습니다
dffinal=pd.DataFrame({'id': [1, 1, 1, 1, 2, 2, 2, 2],'time' [1,2,3,4,1,2,3,4],'choice':['a','a','b','a','b','b','b','b'],'a':[0,1,2,2,0,0,0,0],'b'=[0,0,0,1,0,1,2,3]})
(그것을 가정하는 것은 이미 시간으로 정렬됩니다) :
이def cumulativechoice(df):
length=df.shape[0]
cols=['a','b']
for x in cols:
df[x]=0
for x in cols:
counter=0
for y in range(length):
df.loc[y,x]=counter
if df.loc[y,'choice']==x:
counter=counter+1
return df[cols]
기능은 잘 작동 내 원하는 출력이 있습니다 누적 선택 (subdf)을 실행하면 subdf가 하나의 ID에 대한 하위 DataFrame이고 df.groupby ('id')를 시도하면 연결이 끊어집니다. '누락 된 축에서 색인을 다시 만들 수 없습니다.'라는 오류 메시지가 적용됩니다 (cumulativechoice). 여기서 내가 뭘 잘못하고 있니?
편집 : 더 일반적으로 내 질문은 내 cumulativechoice 내역에 관한 것이 아니라 '올바른'split-apply-combine 수식은 1) 그룹으로 나누기, 2) 적용 여러 dicts/DataFrame 등을 생성하는 함수 및 3) 최종 결과가 출력에 여러 열을 추가 했으므로 다시 결합하여 특별한 경우에는 '변환'만큼 간단하지 않습니다.
이것은 좋게 보이고 원하는 것을 제공하지만 두 번째 DataFrame을 만들지 않고 수동으로 다시 연결하지 않고이 작업을 수행 할 수있는 방법이 있습니다. 실제로 가능한지 모르겠습니다. 나는 여전히 팬더를 배우고 있기 때문에 새로운 컬럼을 만들고 '표준'분할 적용 적용 공식을 다시 연결하는 방법입니까? – Ray
@ 레이 예, 또 다른 방법이 있는데, 이는 더 저렴합니다. 이를 슬라이스 할당이라고합니다. 무엇이든하기 전에 색인을 ID로 설정해야합니다 (내 대답 편집 참조). 또한 S-A-C 패러다임은 데이터 프레임을 그룹으로 분할하고, 각 그룹에서 작동하며 (벡터화되기를 희망 함) 결과를 결합하는 것을 의미합니다. 자세한 내용은 여기에 있습니다. https://pandas.pydata.org/pandas-docs/stable/groupby.html –
설명해 주셔서 감사합니다. 이것은 약간의 멍청한 질문이지만, 결국이 문제와 같은 group-by 연산을 사용하여 n 개의 새로운 열을 추가하려는 일반적인 문제에서, 어떤 종류의 객체가 내 함수 f (x)에서 그룹 출력? DataFrame, 목록이있는 사전 등이되어야합니까? 나는 R에서 각 그룹에 대해 data.frame 스타일 객체 (또는 파이썬리스트의 아날로그)를 출력했다면 최종 출력의 모든 그룹에 걸쳐 그것들을 나를 "쌓을 것"을 알았지 만 동등한 결과는 무엇입니까? 팬더를 사용할 때 각 그룹을 목표로해야합니까? – Ray