여러 열을 참조하는 판다의 '적용' 기능이 작동하지 않는 이유는 무엇입니까?
다음과 같은 데이터 프레임으로 여러 열을 사용할 때 판다 적용 기능에 문제가 있습니다.
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
'itsource' 카테고리의 다른 글
Axios를 사용하여 Vue.js에서 여러 API 호출 취소 (0) | 2023.01.08 |
---|---|
ui-router에서 ui-sref를 사용하여 파라미터를 컨트롤러에 전달하는 방법 (0) | 2023.01.08 |
Java 응용 프로그램의 악성 코드에 대한 샌드박스 (0) | 2023.01.08 |
모든 Java 소스가 오류 없이 컴파일될 때 Eclipse에서 패키지 탐색기 "red-x" 오류 아이콘의 원인은 무엇입니까? (0) | 2023.01.08 |
Python에서 **kwargs를 사용하는 올바른 방법 (0) | 2022.12.24 |