2017-04-06 1 views
2

조건에 따라 데이터 프레임 열의 값을 변경하려고합니다. 내가 이것을 사용하고팬더 .loc을 사용할 때 복사 경고가 설정됩니다.

In [1]:df.head() 
Out[2]:    gen  cont 
timestamp                 
2012-07-01 00:00:00  0.293  0  
2012-07-01 00:30:00  0.315  0  
2012-07-01 01:00:00  NaN   0  
2012-07-01 01:30:00  NaN   0  
2012-07-01 02:00:00  0.231  0 

:

In [1]:df.head() 
Out[2]:    gen  cont 
timestamp                 
2012-07-01 00:00:00  0.293  0  
2012-07-01 00:30:00  0.315  0  
2012-07-01 01:00:00  0.0   0  
2012-07-01 01:30:00  0.005  0  
2012-07-01 02:00:00  0.231  0  

나는, 2 열의 합이 0.01의 임계 값보다 때마다 NaN'gen' 열을 설정할 그래서 내가 원하는 것은 이것이다

df.loc[df.gen + df.con <0.01 ,'gen'] = np.nan 

그것은 나에게 내가 원하는 결과를 제공하지만 경고 :

A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

.loc을 사용하고 있기 때문에 혼란 스럽습니다. 나는 그것을 제안 된 방식으로 사용하고 있다고 생각합니다.

+2

속성이 유효 보이는 열을 액세스 할 수있는 도트의 사용 외에 그 코드는, 당신은 경고를 생성하기 위해이 이전에 뭔가 일을해야합니다. 이 줄 앞에 df를 필터링 했습니까? – EdChum

+0

이전에 df를 필터링했지만이 줄에서 경고가 생성되었습니다. 콘솔에서 해당 줄을 실행하면 경고가 재생됩니다. – doctorer

+0

@doctorer - 필터링 코드를 추가 할 수 있습니까? 어쩌면'df1 = df.copy()'가 필요하다. – jezrael

답변

2

당신의 솔루션은 훌륭하게 작동합니다. mask

대체 솔루션, 그것은 기본적으로 추가 NaN 경우 조건 True :

df['gen'] = df['gen'].mask(df['gen'] + df['cont'] < 0.01) 
print (df) 
      timestamp gen cont 
0 2012-07-01 00:00:00 0.293  0 
1 2012-07-01 00:30:00 0.315  0 
2 2012-07-01 01:00:00 NaN  0 
3 2012-07-01 01:30:00 NaN  0 
4 2012-07-01 02:00:00 0.231  0 

편집 :

당신은 copy이 필요합니다.

나중에 df의 값을 수정하면 수정 내용이 원래 데이터 (df_in)로 전파되지 않으며 팬더가 경고를한다는 것을 알 수 있습니다.

df = df_in.loc[sDate:eDate].copy() 
+0

이것은 OP가 원하는 것이 아니라 경고를 제거하고 싶습니다. 그들은 이미 원하는 결과를 얻었습니다. – EdChum

+0

@EdChum - 죄송합니다. EDIT에 대한 솔루션이라고 생각합니다. 아니면 뭔가 빠졌습니까? – jezrael

+0

df_in을 변경하지 않고 유지하려면 새 df로 복사해야합니다. – doctorer

관련 문제