반응형
팬더는 조건이 충족되는 행에만 적용됩니다.
판다를 이용하고 싶습니다.df.apply
특정 행에 대해서만
예를 들어, 저는 이런 일을 하고 싶지만, 제 실제 문제는 좀 더 복잡합니다.
import pandas as pd
import math
z = pd.DataFrame({'a':[4.0,5.0,6.0,7.0,8.0],'b':[6.0,0,5.0,0,1.0]})
z.where(z['b'] != 0, z['a'] / z['b'].apply(lambda l: math.log(l)), 0)
이 예에서 원하는 것은 'a'의 값을 각 행에 대한 'b'의 값의 로그로 나눈 값이며, 'b'가 0인 행에 대해서는 단순히 0을 반환하고 싶습니다.
다른 답변들은 훌륭하지만, 어떤 상황에서는 방송과 마스킹을 사용하여 동일한 결과를 얻을 수 있는 또 다른 접근법을 추가하고자 합니다.
import numpy as np
mask = (z['b'] != 0)
z_valid = z[mask]
z['c'] = 0
z.loc[mask, 'c'] = z_valid['a'] / np.log(z_valid['b'])
특히 매우 큰 데이터 프레임의 경우, 이러한 접근 방식은 일반적으로 다음을 기반으로 한 솔루션보다 빠를 것입니다.apply()
.
람다 함수에서 if 문을 사용할 수 있습니다.
z['c'] = z.apply(lambda row: 0 if row['b'] in (0,1) else row['a'] / math.log(row['b']), axis=1)
log(1)이 0이기 때문에 1도 제외했습니다.
출력:
a b c
0 4 6 2.232443
1 5 0 0.000000
2 6 5 3.728010
3 7 0 0.000000
4 8 1 0.000000
도움이 되길 바랍니다.그것은 쉽고 읽을 수 있습니다.
df['c']=df['b'].apply(lambda x: 0 if x ==0 else math.log(x))
입력 값이 0이고 전체를 건너뛰면 조건부 람다를 사용하여 0을 반환할 수 있습니다.where
조항:
z['c'] = z.apply(lambda x: math.log(x.b) if x.b > 0 else 0, axis=1)
또한 결과를 새 열에 할당해야 합니다(z['c']
).
분할하는 np.where() 사용a
의 가치에 의해서b
조건을 충족하고 0을 반환하는 경우:
import numpy as np
z['c'] = np.where(z['b'] != 0, z['a'] / np.log(z['b']), 0)
출력:
a b c
0 4.0 6.0 2.232443
1 5.0 0.0 0.000000
2 6.0 5.0 3.728010
3 7.0 0.0 0.000000
4 8.0 1.0 inf
언급URL : https://stackoverflow.com/questions/33769860/pandas-apply-but-only-for-rows-where-a-condition-is-met
반응형
'programing' 카테고리의 다른 글
ReferenceError: 설명이 NodeJs로 정의되지 않았습니다. (0) | 2023.09.13 |
---|---|
Git: 상태, diff 등에서 '수정된 내용'/dirty 서브모듈 항목의 나열을 억제할 수 있습니까? (0) | 2023.09.13 |
사용자가 카메라 사용을 허락했는지 확인하는 방법은? (0) | 2023.09.13 |
utf8_unicode_ci와 utf8mb4_0900_ai_ci의 차이점은 무엇입니까? (0) | 2023.09.13 |
문자열을 C#의 DateTime에 구문 분석 (0) | 2023.09.13 |