itsource

여러 열을 참조하는 판다의 '적용' 기능이 작동하지 않는 이유는 무엇입니까?

mycopycode 2023. 1. 8. 14:38
반응형

여러 열을 참조하는 판다의 '적용' 기능이 작동하지 않는 이유는 무엇입니까?

다음과 같은 데이터 프레임으로 여러 열을 사용할 때 판다 적용 기능에 문제가 있습니다.

df = DataFrame ({'a' : np.random.randn(6),
                 'b' : ['foo', 'bar'] * 3,
                 'c' : np.random.randn(6)})

및 다음 기능

def my_test(a, b):
    return a % b

에서 이 기능을 적용하려고 하면:

df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1)

다음 오류 메시지가 나타납니다.

NameError: ("global name 'a' is not defined", u'occurred at index 0')

이 메시지를 이해할 수 없습니다.이름을 올바르게 정의했습니다.

이 문제에 대해 도움을 주시면 대단히 감사하겠습니다.

갱신하다

도와주셔서 고마워요.제가 코드에 구문을 틀렸기 때문에 인덱스는 ''로 해야 합니다.그러나 다음과 같은 복잡한 기능을 사용해도 동일한 문제가 발생합니다.

def my_test(a):
    cum_diff = 0
    for ix in df.index():
        cum_diff = cum_diff + (a - df['a'][ix])
    return cum_diff 

''당신의 끈을요.

In [43]: df['Value'] = df.apply(lambda row: my_test(row['a'], row['c']), axis=1)

In [44]: df
Out[44]:
                    a    b         c     Value
          0 -1.674308  foo  0.343801  0.044698
          1 -2.163236  bar -2.046438 -0.116798
          2 -0.199115  foo -0.458050 -0.199115
          3  0.918646  bar -0.007185 -0.001006
          4  1.336830  foo  0.534292  0.268245
          5  0.976844  bar -0.773630 -0.570417

그런데, 제 생각에는, 다음과 같은 방법이 더 우아합니다.

In [53]: def my_test2(row):
....:     return row['a'] % row['c']
....:     

In [54]: df['Value'] = df.apply(my_test2, axis=1)

( % 하면 (a)) % (b))는필요 .apply직접 실행하기만 하면 됩니다.

In [7]: df['a'] % df['c']                                                                                                                                                        
Out[7]: 
0   -1.132022                                                                                                                                                                    
1   -0.939493                                                                                                                                                                    
2    0.201931                                                                                                                                                                    
3    0.511374                                                                                                                                                                    
4   -0.694647                                                                                                                                                                    
5   -0.023486                                                                                                                                                                    
Name: a

DataFrame df의 'a' 및 'b' 열에 함수 add5를 적용한다고 가정해 보겠습니다.

def add5(x):
    return x+5

df[['a', 'b']].apply(add5)

위의 모든 제안은 유효하지만, 보다 효율적인 연산을 원한다면 (여기서 지적한 바와 같이) numpy 벡터 연산을 활용해야 합니다.

import pandas as pd
import numpy as np


df = pd.DataFrame ({'a' : np.random.randn(6),
             'b' : ['foo', 'bar'] * 3,
             'c' : np.random.randn(6)})

1: "1: "을 사용한 pandas.apply():

%%timeit
def my_test2(row):
    return row['a'] % row['c']

df['Value'] = df.apply(my_test2, axis=1)

가장 느린 주행은 가장 빠른 주행보다 7.49배나 더 오래 걸렸다.이는 중간 결과가 캐시되고 있음을 의미할 수 있습니다.1000루프, 베스트 오브 3: 481µs/루프

2: 2를 사용한 pandas.apply():

%%timeit
df['a'] % df['c']

가장 느린 주행은 가장 빠른 주행보다 458.85배나 더 오래 걸렸다.이는 중간 결과가 캐시되고 있음을 의미할 수 있습니다.10000루프, 베스트 오브 3: 70.9µs/루프

예 3: numpy 어레이를 사용한 벡터화:

%%timeit
df['a'].values % df['c'].values

가장 느린 주행은 가장 빠른 주행보다 7.98배나 더 오래 걸렸다.이는 중간 결과가 캐시되고 있음을 의미할 수 있습니다.100000루프, 베스트 3: 6.39µs/루프

따라서 numpy 어레이를 사용하여 벡터화하면 속도가 거의 2배 향상되었습니다.

이는 이전 솔루션과 동일하지만 df.apply 자체에서 함수를 정의했습니다.

df['Value'] = df.apply(lambda row: row['a']%row['c'], axis=1)

위에서 논의한 세 가지를 모두 비교했다.

값 사용

%timeit df['value']= df['a'] 。값 %df['c']가치

루프당 139µs ± 1.91µs(평균 ± 표준)dev. 7회 주행 중 각각 10000회 루프)

값 없음

%timeit df['value']= df['a']%df['c']

루프당 216µs ± 1.86µs(평균 ± 표준).dev. 7회 주행 중 각 1000회 루프)

기능 적용

%timeit df['Value'] = df.df.df(reda 행: row['a']%row['c']), 축=1)

루프당 474µs ± 5.07µs(평균 ± 표준).dev. 7회 주행 중 각 1000회 루프)

언급URL : https://stackoverflow.com/questions/16353729/why-isnt-my-pandas-apply-function-referencing-multiple-columns-working

반응형