programing

DataFrame의 각 셀에 기능 적용

javajsp 2023. 7. 18. 21:32

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를 사용하여 전달할 수 있습니다.예를 들어, 토글 방법replfoo_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