티스토리 뷰

반응형

Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.

Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.

 

아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.

Set value for particular cell in pandas DataFrame using index

인덱스를 사용하여 판다스 데이터프레임에서 특정 셀에 대한 값 설정

 문제 내용 

I have created a Pandas DataFrame

판다스 데이터프레임을 만들었습니다.

 

df = DataFrame(index=['A','B','C'], columns=['x','y'])

 

and have got this

그리고 이것을 가지고 있습니다.
     x    y A  NaN  NaN B  NaN  NaN C  NaN  NaN 

 

Now, I would like to assign a value to particular cell, for example to row C and column x. I would expect to get this result:

이제 특정 셀에 값을 할당하려고 합니다. 예를 들어 행 C와 열 x에 값을 할당합니다. 저는 다음과 같은 결과를 얻을 것으로 예상합니다.

 

     x    y A  NaN  NaN B  NaN  NaN C  10  NaN 

 

with this code:

다음 코드를 사용했습니다.
df.xs('C')['x'] = 10

 

However, the contents of df has not changed. The dataframe contains yet again only NaNs.

하지만 df의 내용은 바뀌지 않았습니다. 데이터프레임은 다시 NaN만 포함한다.

 

Any suggestions?

좋은 의견있나요?

 

 

 

 높은 점수를 받은 Solution 

RukTech's answer, df.set_value('C', 'x', 10), is far and away faster than the options I've suggested below. However, it has been slated for deprecation.

RukTech의 답변인 df.set_value('C', 'x', 10)는 제가 아래에 제시한 옵션보다 훨씬 빠릅니다. 하지만, 그것은 곧 지원이 중단 될 예정입니다.

 

Going forward, the recommended method is .iat/.at.

앞으로 권장되는 방법은 .iat/.at입니다.

 


Why df.xs('C')['x']=10 does not work:

df.xs('C')['x']=10이 작동하지 않는 이유:

 

df.xs('C') by default, returns a new dataframe with a copy of the data, so

기본적으로 df.xs('C')는 데이터 복사본과 함께 새 데이터프레임을 반환합니다.
df.xs('C')['x']=10

 

modifies this new dataframe only.

이 새 데이터프레임만 수정합니다.

 

df['x'] returns a view of the df dataframe, so

df['x']는 df 데이터 프레임의 뷰를 반환하므로
df['x']['C'] = 10

 

modifies df itself.

df 자체를 수정합니다.

 

Warning: It is sometimes difficult to predict if an operation returns a copy or a view. For this reason the docs recommend avoiding assignments with "chained indexing".

경고: 작업이 복사본 또는 뷰를 반환하는지 예측하기 어려운 경우가 있습니다. 이러한 이유로 문서는 "체인 인덱싱"으로 할당을 피하는 것이 좋습니다.

 


So the recommended alternative is

그래서 추천하는 대안은
df.at['C', 'x'] = 10

 

which does modify df.

그것은 df를 수정합니다.

 


In [18]: %timeit df.set_value('C', 'x', 10)
100000 loops, best of 3: 2.9 µs per loop

In [20]: %timeit df['x']['C'] = 10
100000 loops, best of 3: 6.31 µs per loop

In [81]: %timeit df.at['C', 'x'] = 10
100000 loops, best of 3: 9.2 µs per loop

 

 

 가장 최근 달린 Solution 

Avoid Assignment with Chained Indexing

연결된 인덱싱을 사용하여 할당 방지

 

You are dealing with an assignment with chained indexing which will result in a SettingWithCopy warning. This should be avoided by all means.

SettingWithCopy 경고가 발생하는 체인 인덱싱을 사용하여 할당을 처리하고 있습니다. 이것은 반드시 피해야 합니다.

 

Your assignment will have to resort to one single .loc[] or .iloc[] slice, as explained here. Hence, in your case:

여기에 설명된 바와 같이 할당은 단일 .loc[] 또는 .iloc[] 슬라이스에 의존해야 합니다. 따라서, 당신의 경우:
df.loc['C', 'x'] = 10

 

 

출처 : https://stackoverflow.com/questions/13842088/set-value-for-particular-cell-in-pandas-dataframe-using-index

반응형
댓글
공지사항
최근에 올라온 글