2014-10-30 4 views
2

나는 아주 간단한 문제가있다. 팬더 데이터 프레임의 주어진 행에서 주어진 열의 값을 변경하고 싶습니다. 나는 다음과 같은 방법으로 그것을 수행하려고 : 나는 다음과 같은 경고를 얻을 결과판다 데이터 프레임의 한 "셀"에서 값을 수정하는 방법은 무엇입니까?

df['column3'].loc[this_date] = val 

:

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 

이 경고의 나의 해석은 그 열 이름 ('column3')와 loc I을 사용하여 데이터 프레임의 원하는 셀을 실제로 액세스 (참조)하지 마십시오. 대신, "셀"개체의 복사본 인 개체를 만든 다음이 "복사 개체"와 연결된 값을 변경하려고합니다.

내가 이해할 수없는 것은 작동하는 것 같습니다. 팬더가 저에게 사본을 수정하려고한다는 사실을 기재 했음에도 불구하고 원본 데이터 프레임을 수정합니다.

내 질문은 팬더가 불평하지 않도록 내가하고 싶은 일을 "올바른"방식으로 수행하고 있는지 확인하는 방법입니다.

+1

[this_date, '3 열'] = 발 : 그렇지 않으면 당신은 pd.set_option('mode.chained_assignment', None)

값을 설정하는 귀하의 방법은 다음과 같은 것들과 함께, 괜찮하여 경고를 억제 할 수 '? 귀하의 버전은 다음과 다를 수 있습니다. http://pandas.pydata.org/pandas-docs/stable/indexing.html – EdChum

+1

사실 그것이 작동한다는 것은 부수적 인 것이며 작동하지 않을 수 있으며 경고를받는 이유입니다. 이전 주석, 아무런 경고도 나타나지 않아야합니다. – EdChum

답변

1

경고를받는 이유는 df 자체가 다른 데이터 프레임 개체의 복사본이기 때문입니다. 원래 데이터 프레임이 df_origin 인 것 같습니다. 그리고 너는 df_origin에서 df을 썰기와 같은 조작으로 얻습니다. 그래서 dfdf_origin입니다. 그런 다음 어떤 값을 df으로 설정하려고하면이 값이 df_origin으로 변경되지 않는다는 경고가 발생합니다. 한 가지 해결책은 df_origin을 신경 쓰지 않는다면 단일 변수를 사용하여 슬라이싱 전후의 데이터 프레임 객체를 가리키는 것입니다. 그것은`df.loc 있어야하지

df.ix[this_date, 'column3] = val 
df.loc[this_date, 'column3'] = val 
df.at[this_date, 'column3'] = val 
+0

체인 된 인덱싱이 좋지 않기 때문에 경고가 표시됩니다! 기본 데이터 (보기 여부)와 혼합 된 dtype인지 여부에 따라 다릅니다. 이러한 조건이 충족되면 사본을 설정하게되므로 경고 메시지가 표시됩니다. 이제까지 연쇄 색인 생성을하지 않는 이유는 설정이 작동한다는 보장이 없다는 것입니다. 다른 여러 인덱싱 옵션을 사용할 수 있습니다. – Jeff

관련 문제