다음 데이터 프레임을 고려하십시오.
A B C D
0 foo one 0.162003 0.087469
1 bar one -1.156319 -1.526272
2 foo two 0.833892 -1.666304
3 bar three -2.026673 -0.322057
4 foo two 0.411452 -0.954371
5 bar two 0.765878 -0.095968
6 foo one -0.654890 0.678091
7 foo three -1.789842 -1.130922
다음 명령이 작동합니다.
> df.groupby('A').apply(lambda x: (x['C'] - x['D']))
> df.groupby('A').apply(lambda x: (x['C'] - x['D']).mean())
그러나 다음 작업은 없습니다.
> df.groupby('A').transform(lambda x: (x['C'] - x['D']))
ValueError: could not broadcast input array from shape (5) into shape (5,3)
> df.groupby('A').transform(lambda x: (x['C'] - x['D']).mean())
TypeError: cannot concatenate a non-NDFrame object
왜? 문서의 예제transform
는 그룹 을 호출 하면 행 단위 작업 처리를 수행 할 수 있다고 제안합니다 .
# Note that the following suggests row-wise operation (x.mean is the column mean)
zscore = lambda x: (x - x.mean()) / x.std()
transformed = ts.groupby(key).transform(zscore)
다시 말해, 변환은 본질적으로 특정 유형의 적용 (집계되지 않는 적용)이라고 생각했습니다. 내가 어디 틀렸어?
참고로 아래는 위의 원래 데이터 프레임 구성입니다.
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C' : randn(8), 'D' : randn(8)})
zscore
) 문서의 예를 보면 transform
각 x
항목이의 항목 인 것으로 가정하는 람다 함수를 수신 하고 그룹의 항목 당group
값을 반환합니다 . 내가 무엇을 놓치고 있습니까?
apply
전체 df를 transform
전달 하지만 각 열을 개별적으로 Series로 전달합니다. 2) apply
모든 모양 출력 (스칼라 / 시리즈 / 데이터 프레임 / 배열 / 목록 ...)을 transform
반환 할 수있는 반면 그룹과 같은 길이의 시퀀스 (1D 시리즈 / 배열 / 목록)를 반환해야합니다. 이것이 OP가 필요 apply()
하지 않은 이유 transform()
입니다. 의사가 두 차이점을 명확하게 설명하지 않았으므로 이것은 좋은 질문입니다. ( apply/map/applymap
또는 다른 것들 과의 구별로 인해 ...)
transform
는 숫자, 행 또는 인수와 동일한 모양을 반환해야합니다. 숫자이면 그룹의 모든 요소로 숫자가 설정되고, 행이면 그룹의 모든 행으로 브로드 캐스트됩니다. 코드에서 람다 함수는 그룹에 브로드 캐스트 할 수없는 열을 반환합니다.