DataFrame의 각 셀에 기능 적용
다음과 같은 데이터 프레임이 있습니다.
A B C
foo bar foo bar
bar foo foo bar
각 행의 모든 요소(또는 각 열의 모든 요소)를 살펴보고 다음 함수를 적용하여 다음 데이터 프레임을 가져오려고 합니다.
def foo_bar(x):
return x.replace('foo', 'wow')
이 기능을 적용하면 데이터 프레임은 다음과 같습니다.
A B C
wow bar wow bar
bar wow wow bar
각 셀에 기능을 적용할 수 있는 간단한 원라이너가 있습니까?
이것은 단순한 예이므로 함수를 적용하는 것 외에 이 특정 예제를 실행하는 더 쉬운 방법이 있을 수 있지만, 제가 정말로 묻고 싶은 것은 데이터 프레임 내의 모든 셀에 함수를 적용하는 방법입니다.
당신의 경우에 맞는 간결한 것을 사용할 수 있습니다.
df.applymap(foo_bar)
# A B C
#0 wow bar wow bar
#1 bar wow wow bar
다른 옵션은 함수를 벡터화한 다음 방법을 사용하는 것입니다.
import numpy as np
df.apply(np.vectorize(foo_bar))
# A B C
#0 wow bar wow bar
#1 bar wow wow bar
제 생각에 당신은np.vectorize:
>>> df[:] = np.vectorize(foo_bar)(df)
>>> df
A B C
foo bar wow bar
bar wow wow bar
>>>
사용 중이므로 더 빠를 수 있습니다.numpy.
Psidom의 답변을 확장하면 정의한 함수가 추가 인수를 수락하면 kwarg를 사용하여 전달할 수 있습니다.예를 들어, 토글 방법repl의foo_bar()OP:
def foo_bar(x, bar=''):
return x.replace('foo', bar)
df.applymap(foo_bar, bar='haha')
일반적인 경우 중 하나는applymap특히 유용한 것은 (OP에서와 같이) 문자열 연산입니다.판다의 문자열 연산은 최적화되지 않았기 때문에, 루프는 특히 연산이 많은 경우 벡터화된 연산보다 더 잘 수행됩니다.예를 들어, 조건을 사용하여 프레임의 값을 바꾸는 다음과 같은 간단한 작업에 대해,applymap동일한 벡터화된 판다 코드보다 3배 이상 빠릅니다.
def foo_bar(x):
return x.replace('foo', 'wow') if len(x)>3 else x + ' this'
df = pd.DataFrame([['foo', 'bar', 'foo bar'], ['bar foo', 'foo', 'bar']]*500000, columns=[*'ABC'])
%timeit df.applymap(foo_bar)
# 1.47 s ± 37.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit df.apply(lambda x: np.where(x.str.len()>3, x.str.replace('foo', 'wow'), x + ' this'))
# 4.64 s ± 597 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
언급URL : https://stackoverflow.com/questions/39475978/apply-function-to-each-cell-in-dataframe
'programing' 카테고리의 다른 글
| 파이썬 모듈은 어디에 저장됩니까? (0) | 2023.07.18 |
|---|---|
| 중첩된 JSON 생성 (0) | 2023.07.18 |
| SQL Server 20008R2에서 ISDRICT FROM과 ISDRICT FROM을 다시 작성하는 방법은 무엇입니까? (0) | 2023.07.18 |
| 벡터에서 여러 값을 삭제하는 방법은 무엇입니까? (0) | 2023.07.18 |
| zsh: 일치하는 항목을 찾을 수 없음: 요청[보안] (0) | 2023.07.18 |