2017-11-21 4 views
1

날짜, 항목 및 2 개의 값이 포함 된 팬더 데이터 프레임이 있습니다. 열 B는 0팬더 - 값이 0보다 큰 경우 조건부로 다른 열을 기준으로 열 나누기?

date  item A B  C  
1/1/2017 a  0 3    0 
1/1/2017 b  2 0    0 
1/1/2017 c  5 2   2.5 
1/1/2017 d  4 1    4 
1/1/2017 e  3 3    1 
1/1/2017 f  0 4    0 
1/2/2017 a  3 3    1 
1/2/2017 b  2 2    1 
1/2/2017 c  3 9 0.333333333 
1/2/2017 d  4 0    0 
1/2/2017 e  5 3 1.666666667 
1/2/2017 f  3 0    0 

동일한 경우이 코드입니다 내가 찾고 있어요 모든 출력은 열 B가 0보다 큰 경우 컬럼 A/열 B의 제품입니다 다른 열이며, 0 내가 쓴하지만, 커널이 죽어 계속

df['C'] = df.loc[df['B'] > 0, 'A']/df['B']) 

무슨 일이 일어나고 있는지에 대한 어떤 생각 (이것은 단지 예를 들어 테이블입니다 명심, 나는이 약 30,000 행이 너무 미친 아무것도 정도)? 무한히 달리는 무언가가 충돌을 일으키고 있습니까? 도와 주셔서 감사합니다.

+0

더 작은 데이터 프레임에서 충돌이 발생합니까? 선험적으로 버그 같은데. 충돌을 일으키는 행/행 세트로 범위를 좁히십시오. – tmrlvi

답변

3

당신이 얻을 수 그 np.where

df['C'] = np.round(np.where(df['B'] > 0, df['A']/df['B'], 0), 1) 

을 사용 또는 당신은 loc에게

df.loc[df['B'] > 0, 'C'] = df['A']/df['B'] 

를 사용하려면 다음 fillna (0)

+0

좋은 친구. 이것은 나의 첫번째 선택이었을 것이다. –

+0

예, 가장 일반적인 것입니다. 나는 거의 마스크를 사용하지 않는다 .... 아직 :) – Vaishali

+0

그게 정말 고맙습니다 .- 공유해 주셔서 감사합니다! 아마 내 오류입니다.하지만 값이 데이터 프레임의 슬라이스 복사본에 설정하려고하는 문제가 발생하고 있습니까? 이전에 그 문제가 없었으므로이 스크립트가 원인인지 궁금합니다. –

3

옵션 1
당신 경우 pd.Series.mask을 사용하여 0을 숨긴 다음 fillna으로 빈 셀을 만듭니다.

v = (df.A/df.B.mask(df.B == 0)).fillna(0) 
v 

0  0.000000 
1  0.000000 
2  2.500000 
3  4.000000 
4  1.000000 
5  0.000000 
6  1.000000 
7  1.000000 
8  0.333333 
9  0.000000 
10 1.666667 
11 0.000000 
dtype: float64 

df['C'] = v 

는 다른 방법으로, x/inf = 0 때문에, np.inf와 그 0을 교체합니다. 당신이 혼합 정수를 원하는 당신의 결과로 수레 경우 명심 df.replace

df.A/df.B.replace(0, np.inf) 

0  0.000000 
1  0.000000 
2  2.500000 
3  4.000000 
4  1.000000 
5  0.000000 
6  1.000000 
7  1.000000 
8  0.333333 
9  0.000000 
10 1.666667 
11 0.000000 
dtype: float64 

df['C'] = (df.A/df.B.mask(df.B == 0, np.inf)) 

옵션 2
직접 교체, 당신은 astype 변환을 수행 할 수 있습니다

df.A.div(df.B.replace(0, np.inf)).astype(object) 

0   0 
1   0 
2   2.5 
3   4 
4   1 
5   0 
6   1 
7   1 
8  0.333333 
9   0 
10  1.66667 
11   0 
dtype: object 
+0

나는 약 2 가지를 게시합니다. :-) 하하 – Wen

+0

@ 원 하하 원한다면 제거 할 수 있습니다. 그것을 게시하십시오. –

+0

필요가 없습니다. 내 의견에 게시하는 것이 좋습니다. :-) 대답이 아닙니다. – Wen