programing

팬더는 조건이 충족되는 행에만 적용됩니다.

goodsources 2023. 9. 13. 22:35
반응형

팬더는 조건이 충족되는 행에만 적용됩니다.

판다를 이용하고 싶습니다.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

반응형